antlr4 如何在 golang 中创建一个树来解析 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)


}

问题是需要一个解析器监听器和一棵树。但是 BaseParser 没有生成树类型对象的功能。https://godoc.org/github.com/antlr/antlr4/runtime/Go/antlr#BaseParserantlr.ParseTreeWalkerDefault.Walk


慕无忌1623718
浏览 191回答 2
2回答

墨色风雨

对于语法中的每个非终端,生成的解析器将具有与非终端同名的方法,该方法不带任何参数,并返回将给定的非终端解析为解析树的结果。这是您应该传递给的树。Walk因此,由于您使用的语法定义了名为 的非终端,因此您可以调用来解析程序并返回适当的解析树。programp.Program()

LEATH

查看文件中的函数。BaseECMAScriptListenerparser/ecmascript_base_listener.gopackage mainimport (    "./parser"    "fmt"    "github.com/antlr/antlr4/runtime/Go/antlr")type echoListener struct {    *parser.BaseECMAScriptListener}// Examplefunc (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; }")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go