Как пропустить все одно- и многострочные комментарии в парсере Parse::RecDescent
В Parse::RecDescent, как эффективно игнорировать комментарии в стиле C++/Java? Это включает в себя однострочное ("//" до конца строки) и многострочное (/все между здесь/).
2 ответа
Решение
<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.