Perl中的C ++样式检查器

时间:2012-08-03 16:01:29

标签: regex perl

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

if( expression ) {if ( expression ) ;

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

既然expression可以由逻辑运算符多行分隔,我如何为它构造正则表达式?

2 个答案:

答案 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)

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

相关问题