[英]antlr4 how to create a Tree in golang to parse javascript
我正在尝试使用 antlr4 在 golang 中创建 javascript 解析器。 我正在使用的语法是这个( https://github.com/antlr/grammars-v4/tree/master/javascript/ecmascript ),我正在按照自述文件 https://github.com/antlr 中的说明进行操作/antlr4/blob/master/doc/go-target.md
所以我已经从语法中生成了词法分析器和解析器文件,并且我正在尝试测试解析程序。
func Parse(program string) {
is := antlr.NewInputStream(program)
lexer := parser.NewECMAScriptLexer(is)
stream := antlr.NewCommonTokenStream(lexer, antlr.TokenDefaultChannel)
p := parser.NewECMAScriptParser(stream)
antlr.ParseTreeWalkerDefault.Walk(&ParserListener{}, tree)
}
问题是antlr.ParseTreeWalkerDefault.Walk
期望解析器侦听器和树。 但是 BaseParser 没有 function 来生成树类型 object。 https://godoc.org/github.com/antlr/antlr4/runtime/Go/antlr#BaseParser
查看parser/ecmascript_base_listener.go
文件中的BaseECMAScriptListener
函数。
package main
import (
"./parser"
"fmt"
"github.com/antlr/antlr4/runtime/Go/antlr"
)
type echoListener struct {
*parser.BaseECMAScriptListener
}
// Example
func (s *echoListener) VisitTerminal(node antlr.TerminalNode) {
fmt.Printf("%v\n", node.GetText())
}
func Parse(program string) {
is := antlr.NewInputStream(program)
lexer := parser.NewECMAScriptLexer(is)
stream := antlr.NewCommonTokenStream(lexer, antlr.TokenDefaultChannel)
p := parser.NewECMAScriptParser(stream)
antlr.ParseTreeWalkerDefault.Walk(&echoListener{}, p.Program())
}
func main() {
Parse("function test(a, b) { return a + b; }")
}
对于语法中的每个非终结符,生成的解析器将有一个与非终结符同名的方法,它不接受 arguments 并将给定非终结符的解析结果作为解析树返回。 那是您应该传递给Walk
的树。
因此,由于您使用的语法定义了一个名为program
的非终端,您可以调用p.Program()
来解析程序并取回适当的解析树。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.