我正在用Perl编写一个C ++样式检查器。但是我在构建基本C ++构造的正则表达式时遇到了困难。例如,if
循环可以具有以下形式:
if( expression ) {
或if ( expression ) ;
我想要的是如果代码不遵循以下准则然后抛出错误
if<space>(expression)<space>{
既然expression
可以由逻辑运算符多行分隔,我如何为它构造正则表达式?
答案 0 :(得分:4)
编程语言不是“常规语言”,严格来说,你不能用正则表达式解析它们。但是,Perl正则表达式可用于定义整个自上而下的递归语法。模块Regexp::Grammars
使这简单,强大和整洁。
您还希望查看(?{CODE})
构造以在解析期间发出警告。你的语法片段看起来像这样(简化,只是为了给你一个想法):
...;
<rule: if-statement>
if ( [ \t]+ | (?{warn q{no spaces around "if" condition at $line}}) )
\( <statement> \)
( [ \t]+ | (?{warn q{no spaces around "if" condition at $line}}) )
\{ <expression>+ \}
<rule: expression>
<statement> ;
<rule: statement>
<assignment> | <function-call> | \( <statement> \)
...;
模块Regexp::Grammars
将在%/
内为您提供完整的语法树供您使用。
答案 1 :(得分:1)
正则表达式的表达力不足以解析上下文无关语法。您可以使用正则表达式来编写词法分析器,但您也必须编写解析器。