ANTLR: исправление ошибок не всегда совпадает с самым длинным совпадающим контекстом - PullRequest
1 голос
/ 15 марта 2019

Я столкнулся со следующей проблемой при попытке написать грамматику для определенного языка сборки.

Пример файла грамматики выглядит следующим образом:

grammar test;
stat: operation+;
operation : (add | addi);


add : 'ADD' datatype  xd ',' xn;
addi : 'ADD.s64' xd ',' '#' imm;

datatype : '.s64'| '.f32';
xd : 'X0' | 'X1';
xn : 'X0' | 'X1';
imm : '0' | '1' | '2' | '3' | '4';

Грамматика должна иметь возможность анализаторадве инструкции по сборке

  1. ДОБАВИТЬ: отл.ADD.s64 X1, X2 или ADD.f32 X1, X2

  2. ADD (im) ex.ADD.s64 X1, # X3

Проблема заключается в том, что add (imm) может иметь только .s64 в качестве типа данных.Я предпочитаю не делать отдельное правило для типа данных ADD (imm).

Однако, когда я вхожу в ADD.s64 X1, X3, парсер всегда совпадает с addi и сообщает об ошибке «не совпадают с #».

Я полагаю, это потому, что логическийпарсера, чтобы найти самое длинное соответствие текста.(что является «ADD.s64»).

Я хочу знать, есть ли способ, я могу сделать восстановление после ошибок, чтобы он мог затем попытаться соответствовать правильным правилам добавления?

1 Ответ

1 голос
/ 18 марта 2019

Инструкция ADD.s64 X1, X3 не может быть сопоставлена, поскольку xn не может быть равен X3.

Поскольку правило add не сопоставлено, анализатор пытается сопоставить правило addi , но терпит неудачу из-за символа '#', который не найден в intruction.

Кстати, как вы написали свою грамматику, addi будет соответствовать шаблону как ADD.s64 X1, # 3, а не ADD.s64 X1, # X3, какхотел

...