Я столкнулся со следующей проблемой при попытке написать грамматику для определенного языка сборки.
Пример файла грамматики выглядит следующим образом:
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';
Грамматика должна иметь возможность анализаторадве инструкции по сборке
ДОБАВИТЬ: отл.ADD.s64 X1, X2 или ADD.f32 X1, X2
ADD (im) ex.ADD.s64 X1, # X3
Проблема заключается в том, что add (imm) может иметь только .s64 в качестве типа данных.Я предпочитаю не делать отдельное правило для типа данных ADD (imm).
Однако, когда я вхожу в ADD.s64 X1, X3, парсер всегда совпадает с addi и сообщает об ошибке «не совпадают с #».
Я полагаю, это потому, что логическийпарсера, чтобы найти самое длинное соответствие текста.(что является «ADD.s64»).
Я хочу знать, есть ли способ, я могу сделать восстановление после ошибок, чтобы он мог затем попытаться соответствовать правильным правилам добавления?