亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號