在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.