У меня была проблема с моей грамматикой Xtext, из-за которой парсер не может восстановиться при достижении ключевого слова с ошибкой.Вот минимальная грамматика, которая воспроизводит проблему и напоминает мою фактическую структуру грамматики:
Model:
'NS' name=ID
(
a+=TypeA |
b+=TypeB |
c+=TypeC
)*
'EndNS'
;
TypeA:
'TypeA' name=ID ';'
;
TypeB:
'TypeB' name=ID
'EndTypeB'
;
TypeC:
'TypeC' name=ID
'EndTypeC'
;
Так что, если я создал файл со следующим текстом:
NS myNamespace
TypeA myA;
TypeB myB
EndTypeB
TypeC myC
EndTypeC
EndNS
И тогда я написал с ошибкойКлючевое слово TypeA
, тогда и записи TypeB
и TypeC
также не удастся проанализировать, несмотря на наличие ключевой грамматики, ориентированной на ключевые слова.(Эта проблема по-прежнему будет возникать, если вы удалите концепцию пространства имен или упорядочите записи типа). Я ожидаю, что запись TypeA
будет нулевой, но при достижении ключевого слова TypeB
анализатор восстановится и добавитих в AST.
Тогда у меня вопрос: есть ли проблема, которую я пропускаю в моей текущей грамматике, и как я могу структурировать эту грамматику, чтобы обеспечить лучшую способность восстановления синтаксического анализатора?