0

我正在用 Perl 编写 C++ 样式检查器。但是我在为基本的 C++ 构造构造正则表达式时遇到了困难。例如if循环可以有以下形式:

if( expression ) { 或者if ( expression ) ;

我想要的是如果代码不遵循以下准则然后抛出错误 if<space>(expression)<space>{

现在expression可以通过逻辑运算符进行多行分隔,我如何构造正则表达式?

4

2 回答 2

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将为您提供一个完整的语法树%/供您使用。

于 2012-08-03T16:19:35.090 回答
1

正则表达式的表达力不足以解析上下文无关的语法。您可以使用正则表达式对您的词法分析器进行编码,但您也必须编写一个解析器。

于 2012-08-03T16:05:25.267 回答