python中的Antlr 4无法按预期工作尝试解析书的章节

问题描述

我想创建一个没有侦听器和访问者的非常简单的ANTLR4解析器(在Python中),该解析器以任意顺序将书的章节和段落作为输入,并返回high_level(章节)和{{ 1}}(段落),例如如果我输入low_level2 a,则应打印“ 第2章,a段”。

这是我的a 2

Example.g4

我在终端中执行此操作 grammar Example; text : paragraph ; paragraph : high_level (WS low_level)? | low_level WS high_level ; low_level : 'a' | 'b' | 'c' ; high_level : '1' | '2' | '3'; WS : [ \t\r\n]+ ;

生成两个python文件,然后我编写了以下python脚本

java -jar ~/antlr-4.8-complete.jar -Dlanguage=python3 -no-listener -no-visitor Example.g4

但是,如果我随后运行它并输入from antlr4 import * from ExampleLexer import ExampleLexer from ExampleParser import ExampleParser def main(): while True: text = InputStream(input(">")) lexer = ExampleLexer(text) stream = CommonTokenStream(lexer) parser = ExampleParser(stream) tree = parser.text() query = tree.paragraph() low_level = query.low_level() high_level = query.high_level() print(f"chapter {high_level},paragraph {low_level}") if __name__ == '__main__': main() ,我会得到 2 a

有人可以解释我在做什么错吗?我不明白方括号中的数字。

解决方法

这只是RuleContext显示的一些调试信息(生成的Low_levelContextHigh_levelContext类从中扩展)。在您的情况下,显示规则的invokingStateparentCtx

看看来源:

class RuleContext(RuleNode):

    ...

    def __str__(self):
        return self.toString(None,None)

    ...

    def toString(self,ruleNames:list,stop:RuleContext)->str:
        with StringIO() as buf:
            p = self
            buf.write("[")
            while p is not None and p is not stop:
                if ruleNames is None:
                    if not p.isEmpty():
                        buf.write(str(p.invokingState))
                else:
                    ri = p.getRuleIndex()
                    ruleName = ruleNames[ri] if ri >= 0 and ri < len(ruleNames) else str(ri)
                    buf.write(ruleName)

                if p.parentCtx is not None and (ruleNames is not None or not p.parentCtx.isEmpty()):
                    buf.write(" ")

                p = p.parentCtx

            buf.write("]")
            return buf.getvalue()

    ...

https://github.com/antlr/antlr4/blob/master/runtime/Python3/src/antlr4/RuleContext.py

您没有解释要显示的内容,但是我想规则匹配的文本,在这种情况下,您可以执行以下操作:

print(f"chapter {high_level.getText()},paragraph {low_level.getText()}")