You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ANTLR4中输出符合自定义解析规则的表达式?

解决ANTLR4解析等式表达式并输出结构化内容的问题

核心问题分析

你当前的问题有两个关键点:

  1. 原语法未定义=符号的匹配规则,无法识别a=5这类等式结构,导致只能捕获单个Token(如a或5)
  2. 动作代码中$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:52:40