如何在ANTLR4中输出符合自定义解析规则的表达式?
解决ANTLR4解析等式表达式并输出结构化内容的问题
核心问题分析
你当前的问题有两个关键点:
- 原语法未定义
=符号的匹配规则,无法识别a=5这类等式结构,导致只能捕获单个Token(如a或5) - 动作代码中
$propos.getText()的引用错误——ANTLR4规则内部的动作里,不能直接用规则名作为变量,需用$ctx指代当前规则上下文
修正后的语法实现
调整语法结构,新增专门处理等式的规则,并修正动作代码逻辑,同时支持多等式连接的场景:
grammar Expr; // 定义成员变量用于生成编号 @members { private int propCounter = 1; } // 支持多个等式通过逻辑运算符连接 propos: eq_expr (op=('&' | '|' | '->') eq_expr)*; // 匹配"变量=值"结构,同时添加动作输出格式化内容 eq_expr: VAR '=' VALUE { System.out.printf("p%d:`%s`,%n", propCounter++, $ctx.getText()); }; // 词法规则 VAR: [a-zA-Z]+; VALUE: [0-9]+; // 跳过空白字符(空格、制表符、换行等) WS: [ \t\r\n]+ -> skip;
代码说明
eq_expr规则:专门捕获变量=值的完整结构,确保不会丢失表达式的整体信息propos规则:修改为支持多个eq_expr通过逻辑运算符连接,完美匹配你输入的a=5 & b=6 & c=7这类场景@members块:定义一个计数器变量,用于生成p1、p2这类编号- 动作代码:使用
$ctx.getText()获取当前eq_expr的完整文本,通过printf输出你需要的格式化结果 WS规则:必须添加,否则输入中的空格会被当作无效Token导致解析失败
运行效果
当解析输入a=5 & b=6 & c=7时,会输出:
p1:`a=5`, p2:`b=6`, p3:`c=7`
错误原因补充
你之前在propos规则里写$propos.getText()报错,是因为ANTLR4中规则内部的动作上下文变量名不是规则本身,而是$ctx。即使要在propos里处理,也应该用$ctx.getText(),但显然把动作放在eq_expr规则里更贴合你提取单个等式的需求。
内容的提问来源于stack exchange,提问作者UPordown
相关产品推荐
相关产品推荐

