在 Parse::RecDescent 中,我如何有效地忽略 C++/Java 样式的注释?这包括单行('//' 直到行尾)和多行(/此处/之间的所有内容)。
问问题
1306 次
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 回答