ANTLR4和Python目标

Dus*_*rea 9 python antlr antlr4

我在使用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 : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
Run Code Online (Sandbox Code Playgroud)

示例(根据标准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)()
Run Code Online (Sandbox Code Playgroud)

我还写了一个听众.为了断言/验证这是正确的,我将在此重复:

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")
Run Code Online (Sandbox Code Playgroud)

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

如果可能的话,Python示例会很棒.

小智 5

我听说你现在也有同样的问题。v4 的 Python 文档毫无用处,而 v3 则有很大不同,无法使用。我正在考虑切换回 Java 来实现我的东西。

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

还可以尝试解析无效输入以查看解析器是否启动。我不确定 getattr(parser,rule_name)() 的行。我按照 Antlr4 Python 目标的文档(不幸的是非常短)中的步骤进行操作:https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Python+Target

您还可以在那里找到一些有关侦听器内容的文档。希望能帮助到你。