当我尝试为某些汇编语言编写语法器时遇到了以下问题。
示例语法文件如下。
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:例如ADD.s64 X1,X2或ADD.f32 X1,X2
ADD(imm)例如ADD.s64 X1,#X3
问题在于,因为add(imm)只能将.s64作为数据类型。 我不希望为ADD(imm)的数据类型制定单独的规则。
但是,当我输入ADD.s64 X1,X3时,解析器始终与addi匹配,并报告错误“无法匹配#”。
我猜这是因为解析器的逻辑是找到文本中最长的匹配项。 (即“ ADD.s64”)。
我想知道有没有办法,我可以进行错误恢复,以便它可以然后尝试匹配正确的添加规则?
答案 0 :(得分:1)
指令ADD.s64 X1, X3
无法匹配,因为xn不能等于X3。
由于不匹配规则 add ,因此解析器尝试匹配规则 addi ,但由于在指令中找不到字符'#'而失败。
顺便说一下,您编写语法的方式,addi将根据需要匹配ADD.s64 X1, # 3
而不是ADD.s64 X1, # X3
之类的模式