繁体   English   中英

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

[英]antlr4 how to create a Tree in golang to parse 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

所以我已经从语法中生成了词法分析器和解析器文件,并且我正在尝试测试解析程序。

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 没有 function 来生成树类型 object。 https://godoc.org/github.com/antlr/antlr4/runtime/Go/antlr#BaseParser

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM