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

