如何设置和调用 ANTLR4 Javascript 访问者
How to set up and invoke ANTLR4 Javascript Visitor
任何人都可以解释或指出一个正在使用的 ANTLR4 Javascript Visitor 实现的工作示例吗? ANTLR4 Javascript Target 的文档显示了如何实现 Listener,而不是 Visitor。
这个问题与 ANTLR 语法无关,甚至与工具本身无关。我可以使用该工具愉快地生成访问者JS文件。我只是不知道如何调用它。
Listener 是您实现的东西并由 ANTLR walker 调用。您必须设置 walker,为其提供解析树和侦听器实现。
访客只是您自称的 class。您调用的函数对应于相关的 AST 节点,并被命名为 visitStatement
或 visitProgram
。该名称基于 ANTLR 语法分析器规则, 或 如果您已经给定子规则名称(使用 #alternativeNameForThisSubrule
语法),它基于您给它的名称。但它会有 visit
前缀。
这就是让我感到困惑的原因,因为我看到的示例愉快地使用 visit
作为实际功能的替代品。
无论哪种方式,访问者的使用都是完全手动的。
var chars = new antlr4.InputStream(input)
var lexer = new FancyLexer(chars)
var tokens = new antlr4.CommonTokenStream(lexer)
var parser = new FancyParser(tokens)
parser.buildParseTrees = true
var tree = parser.block() // 'block' is the start rule
var visitor = new FancyVisitor()
return visitor.visitBlock(tree) // 'visitBlock' since that was the start rule
任何人都可以解释或指出一个正在使用的 ANTLR4 Javascript Visitor 实现的工作示例吗? ANTLR4 Javascript Target 的文档显示了如何实现 Listener,而不是 Visitor。
这个问题与 ANTLR 语法无关,甚至与工具本身无关。我可以使用该工具愉快地生成访问者JS文件。我只是不知道如何调用它。
Listener 是您实现的东西并由 ANTLR walker 调用。您必须设置 walker,为其提供解析树和侦听器实现。
访客只是您自称的 class。您调用的函数对应于相关的 AST 节点,并被命名为 visitStatement
或 visitProgram
。该名称基于 ANTLR 语法分析器规则, 或 如果您已经给定子规则名称(使用 #alternativeNameForThisSubrule
语法),它基于您给它的名称。但它会有 visit
前缀。
这就是让我感到困惑的原因,因为我看到的示例愉快地使用 visit
作为实际功能的替代品。
无论哪种方式,访问者的使用都是完全手动的。
var chars = new antlr4.InputStream(input)
var lexer = new FancyLexer(chars)
var tokens = new antlr4.CommonTokenStream(lexer)
var parser = new FancyParser(tokens)
parser.buildParseTrees = true
var tree = parser.block() // 'block' is the start rule
var visitor = new FancyVisitor()
return visitor.visitBlock(tree) // 'visitBlock' since that was the start rule