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

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

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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