我正在用 Perl 编写 C++ 样式检查器。但是我在为基本的 C++ 构造构造正则表达式时遇到了困难。例如if
循环可以有以下形式:
if( expression ) {
或者if ( expression ) ;
我想要的是如果代码不遵循以下准则然后抛出错误
if<space>(expression)<space>{
现在expression
可以通过逻辑运算符进行多行分隔,我如何构造正则表达式?
编程语言不是“常规语言”,严格来说你不能用正则表达式解析它们。然而 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
将为您提供一个完整的语法树%/
供您使用。
正则表达式的表达力不足以解析上下文无关的语法。您可以使用正则表达式对您的词法分析器进行编码,但您也必须编写一个解析器。