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

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

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

Go
慕无忌1623718 2022-08-01 10:36:06
我正在尝试使用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
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

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

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


查看完整回答
反对 回复 2022-08-01
?
LEATH

TA贡献1936条经验 获得超7个赞

查看文件中的函数。BaseECMAScriptListenerparser/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-08-01
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号