java - 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';
语法应该能够解析两条汇编指令
添加:例如。ADD.s64 X1、X2 或 ADD.f32 X1、X2
添加(IMM)前。ADD.s64 X1,#X3
问题是因为 add(imm) 只能将 .s64 作为数据类型。我不想为 ADD(imm) 的数据类型制定单独的规则。
但是,当我输入ADD.s64 X1,X3时,解析器总是匹配addi,并报错“fail to match the #”。
我想这是因为解析器的逻辑是找到文本的最长匹配。(即'ADD.s64')。
我想知道有没有办法,我可以进行错误恢复,以便它可以尝试匹配正确的添加规则?
解决方案
该指令ADD.s64 X1, X3
无法匹配,因为 xn 不能等于 X3。
因为规则add不匹配,解析器尝试匹配规则addi,但由于在指令中找不到字符“#”而失败。
顺便说一句,您编写语法的方式,addi 将根据需要匹配模式 likeADD.s64 X1, # 3
和 notADD.s64 X1, # X3
推荐阅读
- reactjs - React Hooks .map 不是函数
- python - 如何在文件资源管理器中删除/移动/上传文件?| Python
- wordpress - 正确获取页面名称(使用 Barba.JS 和 Wordpress 的 data-barba-namespace)
- php - 如何在php中返回字符串“添加到朋友”?
- python - 根据 glob 列表复制和重命名子目录中的文件
- r - R中的分层样本
- linux - Docker内部的crontab:psql函数没有终止,堆积进程
- sql - 为什么 Snowflake 会在 WHERE 子句中排除匹配的 NULL 值?
- function - PowerShell - Export-Csv:无法将参数绑定到参数“InputObject”,因为它为空
- web - Tokbox:订阅者在网络摄像头中看到自己