В Parse :: RecDescent, как я могу эффективно игнорировать комментарии в стиле C++/Java? Это включает в себя однострочный ('//' до конца строки) и многострочный (/ все здесь /).как пропустить все одно- и многострочные комментарии в парсе :: рекурсивный парсер
1
A
ответ
2
<skip>
определяет, что анализатор рассматривает пробелы.
parse: <skip: qr{(?xs:
(?: \s+ # Whitespace
| /[*] (?:(?![*]/).)* [*]/ # Inline comment
| // [^\n]* \n? # End of line comment
)
)*}>
main_rule
/\Z/
{ $item[2] }
В отличие от решения Nate Гленна, мой
- Не устанавливает глобальную переменную, затрагивающей все парсеры.
- Не использует ненужные захваты.
- Не использует неживой модификатор. (Он использовал нежадное модификатор, чтобы убедиться, некоторые символы не совпадает в некоторых местах, но не жадный модификатор не гарантирует, что.)
Примечание: (?:(?!STRING).)*
является (?:STRING)
, как [^CHAR]
- CHAR
.
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.
Спасибо! У меня был ответ, но я надеялся на улучшение. –
О, я не осознавал, что это ваш собственный вопрос, на который вы отвечали! ха-ха! Честно говоря, ответ был довольно хорошим. 1) Если вы хотите использовать $ Parse :: RecDescent :: skip, просто используйте 'local', чтобы ограничить изменение, когда скомпилирована грамматика. 2) Потери скорости будут незначительными, учитывая, насколько медленным является ПРД. 3) Я в основном в безопасности. Это может быть или не быть проблемой в зависимости от того, как PRD использует регулярное выражение. – ikegami