如何跳过Parse :: RecDescent解析器中的所有单行和多行注释

时间:2012-07-03 19:52:45

标签: perl parsing parse-recdescent

在Parse :: RecDescent中,如何有效地忽略C ++ / Java样式注释?这包括单行(' //'直到行尾)和多行(/ 此处之间的所有内容 /)。

2 个答案:

答案 0 :(得分:2)

<skip>定义解析器认为的空格。

parse: <skip: qr{(?xs:
          (?: \s+                       # Whitespace
          |   /[*] (?:(?![*]/).)* [*]/  # Inline comment
          |   // [^\n]* \n?             # End of line comment
          )
       )*}>
       main_rule
       /\Z/
       { $item[2] }

与Nate Glenn的解决方案不同,我的

  • 不设置影响所有解析器的全局变量。
  • 不使用不必要的捕获。
  • 不使用非贪婪修饰符。 (他使用非贪婪修饰符确保某些字符在某些位置不匹配,但非贪婪修饰符并不保证。)

注意:(?:(?!STRING).)*(?:STRING)[^CHAR]CHAR

答案 1 :(得分:1)

您必须设置$Parse::RecDescent::skip的值。默认情况下,Parse :: RecDescent会跳过所有空白区域。如果将此变量设置为匹配空格和注释的正则表达式,则可以跳过它们。使用此:

$Parse::RecDescent::skip = 
    qr{
        (
            \s+                 #whitespace
                |               #or
            /[*] .*? [*]/ \s*   #a multiline comment
                |               #or
            //.*?$               #a single line comment
        )*                      #zero or more

    }mxs;
# m allows '$' to match a newline, x allows regex comments/whitespace, 
# s allows '.' to match newlines.