1

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

4

2 回答 2

2

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

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

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

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

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

于 2012-07-04T01:05:40.960 回答
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.
于 2012-07-03T19:52:44.930 回答