当前位置: 首页 > 知识库问答 >
问题:

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

袁青青
2023-03-14

我试图使用ANTLR4在golang创建一个javascript解析器。我使用的语法是这样的(https://github.com/antlr/grammars-v4/tree/master/javascript/ecmascript),我遵循自述文件https://github.com/antlr/antlr4/blob/master/doc/go-target.md中的说明

因此,我从语法中生成了lexer和parser文件,并试图测试一个程序的解析。

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

共有1个答案

步衡
2023-03-14

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

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

 类似资料:
  • 有什么方法可以让ANTLR4自动删除生成的解析树中的冗余节点吗? 更具体地说,我一直在试验GLSL的语法,由于自动处理操作符优先级所需的规则转发,您最终会在解析树中看到长的线性“表达式”序列。 大多数生成的树节点都只是简单地“转发到下一个优先级”,所以不要提供任何有用的语法信息--你只需要每个序列中最后一个表达式节点(即规则转发停止的点),或者它成为一个实际的树节点并拥有多个子节点的点(即在源中遇

  • 我正在尝试创建一个语法。到目前为止,这是我的代码: 我真的只是希望语法从输入中创建一个列表/哈希表树。代码的输出是: 看起来还不错。perl6似乎在解码这样一个事实,即字段描述符由多个字段描述符组成,但实际上似乎并没有将它们放入列表中。我可以说$fds ,但我不能说$fds[0] 。为什么前者“起作用”,而后者不起作用? 我必须承认,我对正在发生的事情掌握得相当薄弱。使用规则而不是令牌会更好吗?我

  • 我已经搜索了很多关于这一点,我没有找到任何有用的,真正帮助我建立一个AST。我已经知道ANTLR4不像ANTLR3以前那样构建AST。每个人都说:“嘿,使用访客!”,但我找不到任何例子或更详细的解释,说明我该如何做到这一点... 我有一个语法必须像C,但与每一个命令写葡萄牙语(葡萄牙编程语言)。我可以使用ANTLR4轻松地生成解析树。我的问题是:我现在需要做什么来创建一个AST? 编辑2:现在我有

  • 我的查询参数如下所示: 我必须接受这个查询参数,因为它进入了我的spring控制器,并且必须向solar查询以获取数据。 首先使用regex进行以下转换:(abcbcd)+----------segment1 最后名称:ABC+...............Segment2 电子邮件:ABC+...............Segment3 我有一门课叫 类Queryobj{ 私有字符串字段; 值=

  • 问题内容: 输出: 我有api调用返回的结果,它就像对象数组(json数组)的复杂格式。我需要通过golang解析该结果,我该如何实现?以下数据是我的结果,它是从api调用获取的。 问题答案: 您仅错过了一点:您需要导出结构的字段: 它将起作用(在Go Playground上尝试): 请注意,JSON文本包含带有小写字母文本的字段名称,但是包足够“聪明”以匹配它们。如果它们完全不同,则可以使用st

  • 我对JavaScript非常陌生,我的工作任务是制作一个html解析器,它可以遍历HTML文件的行,找到ID标记,然后将其与excel表(或CSV)匹配,然后用电子表格/ CSV文件中的值交换ID。 注:我不是要求你为我做这件事;只是我已经查看了加载,我只是不知道我需要什么样的解析器。如果方向正确,那将是非常感谢的。 下面是一个带有ID的HTML文档示例:(ID的前缀是#IDHERE#,因为我还不