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

使用ANTLR语法规则在Go中解析表达式后如何输出最终计算结果

解决ANTLR Go目标中表达式计算结果输出的问题

我帮你找到了问题所在,你修改stat规则时犯了一个小错误——引用了错误的返回值名称。你的e规则明确声明返回的是int v,所以应该用$e.v来访问这个计算结果,而不是错误的$e.int。

正确修改后的stat规则

把原有的stat规则替换成下面的代码,就能正常输出最终结果了:

stat: e NEWLINE {
    fmt.Printf("=%d\n", $e.v)
} | NEWLINE ;

额外的语法修正提示

另外,你原来的e规则里的fmt.Fprintf语句存在语法问题:直接换行的写法在Go里是不合法的,应该用转义字符\n。修正后的e规则动作代码如下:

a=e op=('+'|'-') b=e {
    $v = eval($a.v, $op, $b.v)
    fmt.Fprintf(os.Stdout, "got args=%d %d\n", $a.v, $b.v)
}
| INT {
    $v = $INT.int
    fmt.Fprintf(os.Stdout, "got number=%d\n", $v)
} ;

验证运行步骤

  1. 重新生成Go解析器代码:
java org.antlr.v4.Tool -Dlanguage=Go -o parser -no-listener Expr.g4
  1. 重新编译Go测试程序:
go build expr_t.go
  1. 测试运行:比如创建一个输入文件test.txt,内容写1+2*3,然后执行./expr_t test.txt,就能看到输出的最终计算结果(注:当前语法中+和-的优先级和*一致且是左递归,所以1+2*3会被计算为(1+2)*3=9,如果需要符合常规的运算符优先级,你需要调整语法结构,把乘法规则拆分出来,不过这是额外的优化点)。

内容的提问来源于stack exchange,提问作者xpt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:42:44