为了账号安全,请及时绑定邮箱和手机立即绑定

antlr4如何在golang中创建一棵树来解析javascript

antlr4如何在golang中创建一棵树来解析javascript

Go
呼啦一阵风 2022-07-25 10:47:04
我正在尝试使用 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 没有生成树型对象的功能。https://godoc.org/github.com/antlr/antlr4/runtime/Go/antlr#BaseParser
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2022-07-25
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

查看文件中的BaseECMAScriptListener函数parser/ecmascript_base_listener.go。


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

}


查看完整回答
反对 回复 2022-07-25
  • 2 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信