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