#parsing #rust #pest
Вопрос:
Я пытаюсь написать синтаксический анализатор с помощью генератора анализатора ржавчины PEST. У меня проблемы с довольно простой грамматикой. file
это правило верхнего уровня в грамматике. В нем содержатся SOI
EOI
правила и.
// example.pest
WHITESPACE = _ { "n" | " " }
COMMENT = _{ "(*" ~ ANY* ~ "*)" }
KEYWORD = { ^"keyword" }
file = _{ SOI ~ KEYWORD ~ EOI }
Вот содержимое файла, который я пытаюсь разобрать:
(*
*)
keyword
Созданный синтаксический анализатор не может проанализировать этот файл. Ошибка выглядит так:
1 | (*␊
| ^---
|
= expected KEYWORD
Встроенное COMMENT
правило должно справиться с этой ситуацией. По-другому ли обрабатываются пробелы в комментариях?
Как правильно написать грамматику с комментариями?
Комментарии:
1. Какие окончания строк использует ваш тестовый файл? IOW это файл Windows (
rn
), Linux (n
) или macOS (r
)?2. На самом деле это не было связано с окончаниями строк. Смотрите ответ, который я опубликовал
Ответ №1:
На самом деле в логике грамматики, приведенной здесь, есть ошибка. Это правило в грамматике будет соответствовать всему до конца файла.
COMMENT = _{ "(*" ~ ANY* ~ "*)" }
Правило должно быть
COMMENT = _{ "(*" ~ (!"*)" ~ ANY)* ~ "*)" }
Это означает, что будет сопоставлено любое количество символов, но не все, что похоже *)
. Как только *)
он встречается, следующая часть последовательности достигается и *)
сопоставляется, и все правило выполняется.