Анализатор ВРЕДИТЕЛЕЙ не распознает комментарии

#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)* ~ "*)" }
 

Это означает, что будет сопоставлено любое количество символов, но не все, что похоже *) . Как только *) он встречается, следующая часть последовательности достигается и *) сопоставляется, и все правило выполняется.