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



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

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

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

与内特·格伦的解决方案不同,我的

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

注意:(?:(?!STRING).)*(?:STRING),就像[^CHAR]CHAR一样。

您必须设置 $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.

相关内容

  • 没有找到相关文章

最新更新