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

因此,我已经根据语法生成了lexer和解析器文件,并且我正在尝试测试解析程序。

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)
}

问题是CCD_ 1需要一个解析器监听器和一个树。但是BaseParser没有生成树类型对象的函数。https://godoc.org/github.com/antlr/antlr4/runtime/Go/antlr#BaseParser

对于语法中的每个非终端,生成的解析器将有一个与非终端同名的方法,该方法不带参数,并将解析给定非终端的结果作为解析树返回。这是应该传递给Walk的树。

因此,由于您使用的语法定义了一个名为program的非终端,因此您可以调用p.Program()来解析程序并返回一个适当的解析树。

查看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("%vn", 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; }")
}

相关内容

  • 没有找到相关文章

最新更新