ANTLR:错误恢复不总是与最长的匹配上下文匹配

时间:2019-03-15 18:59:56

标签: java parsing antlr antlr4

当我尝试为某些汇编语言编写语法器时遇到了以下问题。

示例语法文件如下。

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:例如ADD.s64 X1,X2或ADD.f32 X1,X2

  2. ADD(imm)例如ADD.s64 X1,#X3

问题在于,因为add(imm)只能将.s64作为数据类型。 我不希望为ADD(imm)的数据类型制定单独的规则。

但是,当我输入ADD.s64 X1,X3时,解析器始终与addi匹配,并报告错误“无法匹配#”。

我猜这是因为解析器的逻辑是找到文本中最长的匹配项。 (即“ ADD.s64”)。

我想知道有没有办法,我可以进行错误恢复,以便它可以然后尝试匹配正确的添加规则?

1 个答案:

答案 0 :(得分:1)

指令ADD.s64 X1, X3无法匹配,因为xn不能等于X3。

由于不匹配规则 add ,因此解析器尝试匹配规则 addi ,但由于在指令中找不到字符'#'而失败。

顺便说一下,您编写语法的方式,addi将根据需要匹配ADD.s64 X1, # 3而不是ADD.s64 X1, # X3之类的模式