ANTLR4和Python目标

我遇到的问题是ANTLR4中的Python目标。 似乎有很少的例子可用,去相应的Java代码似乎并不相关。

我使用标准的Hello.g4语法:

// Define a grammar called Hello
grammar Hello;
r  : 'hello' ID ;         // match keyword hello followed by an identifier
ID : [a-z]+ ;             // match lower-case identifiers
WS : [ trn]+ -> skip ; // skip spaces, tabs, newlines

示例(从标准Hello.g4示例构建):

input_ = antlr4.FileStream(_FILENAME)
lexer = HelloLexer.HelloLexer(input_)
stream = antlr4.CommonTokenStream(lexer)
parser = HelloParser.HelloParser(stream)

rule_name = 'r'
tree = getattr(parser, rule_name)()

我也写了一个听众。 为了声明/确认这是正确的,我在这里重复一遍:

class HelloListener(antlr4.ParseTreeListener):
    def enterR(self, ctx):
        print("enterR")

    def exitR(self, ctx):
        print("exitR")

    def enterId(self, ctx):
        print("enterId")

    def exitId(self, ctx):
        print("exitId")

所以,首先,我不能保证我给它的字符串是有效的,因为我没有得到任何屏幕输出。 如何从树对象中判断是否有任何匹配项? 我如何提取匹配规则/令牌?

如果可能的话,Python的例子会很棒。


我听到你,现在有同样的问题。 v4的Python文档是无用的,v3的用处不同。 我正在考虑切换回Java来实现我的东西。

关于您的代码:我认为您自己的自定义侦听器必须从生成的HelloListener继承。 你可以在那里打印。

也尝试解析无效输入来查看解析器是否开始。 我不清楚getattr(parser,rule_name)()的界限。 我遵循Antlr4 Python目标(很不幸很短)的文档中的步骤:https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Python+Target

你也可以在那里找到一些关于监听器的文档。 希望能帮助到你。


我使用Hello语法为Python 2创建了一个示例。

以下是相关的代码:

from antlr4 import *
from HelloLexer import HelloLexer
from HelloListener import HelloListener
from HelloParser import HelloParser
import sys

class HelloPrintListener(HelloListener):
    def enterHi(self, ctx):
        print("Hello: %s" % ctx.ID())

def main():
    lexer = HelloLexer(StdinStream())
    stream = CommonTokenStream(lexer)
    parser = HelloParser(stream)
    tree = parser.hi()
    printer = HelloPrintListener()
    walker = ParseTreeWalker()
    walker.walk(printer, tree)

if __name__ == '__main__':
    main()

正如晶圆厂所说,关键是从生成的HelloListener继承。 在这个问题上似乎有一些挑剔,你可以看到如果你修改我的HelloPrintListener直接从ANTLR的ParseTreeListener继承。 我想这会工作,因为生成的HelloListener只有空方法,但我看到了与您看到的相同的行为(不会调用监听器方法)。

尽管缺乏Python侦听器的文档,但可用的方法与Java相似。


antlr文档已更新以记录对python 3和python 4目标的支持。 将antlr书籍转换为python3的例子可以在这里找到,它们足以让任何人开始。

链接地址: http://www.djcxy.com/p/26347.html

上一篇: ANTLR4 and the Python target

下一篇: AndroidStudio: always run on all connected devices