登录
首页 >  Golang >  Go问答

在遍历解析树时使用ANTLR来获取符号名称

来源:stackoverflow

时间:2024-02-13 18:48:25 363浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《在遍历解析树时使用ANTLR来获取符号名称》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我正在关注 https://blog.gopheracademy.com/advent-2017/parsing-with-antlr4-and-go/,并且

我正在查看 https://github.com/bramp/goadvent-antlr/blob/master/example2.go,它没有输出。现在,

我想使用 EnterEveryRule 输出遇到的每个符号及其符号名称。我怎样才能做到这一点?

即,如何在任何特定阶段以某种方式访问​​ symbolicNames 切片,以了解我正在处理哪个 SymbolicName。


正确答案


我当然不是 go 专家,但该示例包含以下几行:

// Finally parse the expression (by walking the tree)
    antlr.ParseTreeWalkerDefault.Walk(&calcListener{}, p.Start())

这有点误导。该语句的 p.start() 部分实际上进行了解析(调用 p.start() 应该返回一个 antlr 解析树。此时,您已经完成了解析。

antlr.parsetreewalkerdefault.walk() 是如何遍历解析树,调用 listener 上的方法,该解析树与从 p.start() 调用获得的解析树一起传入。您可能希望在将其传递给 walker 之前将其存储在临时变量中(也许在调试器中检查它以理解它,或者,它应该具有类似 tostringtree(...) 函数的功能,该函数将为您提供字符串表示形式解析树。)

看来 calclistener 仅具有对 parser.basecalclistener 的引用。 antlr 生成的 base*listeners 是“不执行任何操作”的侦听器,仅提供侦听器需要实现的所有方法的空实现。

您需要使用 calclistener 执行某些操作以“覆盖”entereveryrule 函数,并对传递给它的 *context 对象执行某些操作。

以上就是《在遍历解析树时使用ANTLR来获取符号名称》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>