首页 > 解决方案 > ANTLR:错误恢复并不总是与最长匹配的上下文匹配

问题描述

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

示例语法文件看起来像。

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. 添加(IMM)前。ADD.s64 X1,#X3

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

但是,当我输入ADD.s64 X1,X3时,解析器总是匹配addi,并报错“fail to match the #”。

我想这是因为解析器的逻辑是找到文本的最长匹配。(即'ADD.s64')。

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

标签: javaparsingantlrantlr4

解决方案


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

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

顺便说一句,您编写语法的方式,addi 将根据需要匹配模式 likeADD.s64 X1, # 3和 notADD.s64 X1, # X3


推荐阅读