【问题标题】:Python ANTLR4 example - Parser doesn't seem to parse correctlyPython ANTLR4 示例 - 解析器似乎无法正确解析
【发布时间】:2019-12-25 00:29:39
【问题描述】:

为了演示这个问题,我将创建一个简单的语法来仅检测类似 Python 的变量。

我创建一个虚拟环境并在其中安装antlr4-python3-runtime,如“Where can I get the runtime?”中所述:

然后,我创建一个PyVar.g4 文件,内容如下:

grammar         PyVar;

program:        IDENTIFIER+;

IDENTIFIER:     [a-zA-Z_][a-zA-Z0-9_]*;

NEWLINE:        '\n' | '\r\n';

WHITESPACE:     [ ]+ -> skip;

现在如果我用grun 测试语法,我可以看到语法检测到变量很好:

现在我正在尝试用 Python 编写一个解析器来做到这一点。我使用以下命令生成 Lexer 和 Parser:

antlr4 -Dlanguage=Python3 PyVar.g4

它们的生成没有错误:

但是当我使用“How do I run the generated lexer and/or parser?”中提供的示例时,我没有得到任何输出:

我做错了什么?

【问题讨论】:

    标签: python-3.x parsing antlr antlr4 grammar


    【解决方案1】:

    这里有两个问题。

    1.语法

    在我有的那一行,

    program:        IDENTIFIER+;
    

    解析器只会检测一个或多个变量,它不会检测任何换行符。您在运行grun 时看到的输出是词法分析器创建的输出,这就是令牌中存在换行符的原因。所以我不得不用这样的东西替换它,以便解析器检测换行符。

    program:        (IDENTIFIER | NEWLINE)+;
    

    2。打印解析器的输出

    PyVar.py 文件中,我用这一行创建了一棵树:

    tree = parser.program()
    

    但它没有打印输出,我也不知道如何打印,但OP's comment on this accepted answer 建议使用tree.toStringTree()

    现在,如果我们修复这些问题,我们可以看到它有效:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 2013-04-11
      • 2016-01-21
      • 2018-05-30
      • 2014-02-23
      • 1970-01-01
      相关资源
      最近更新 更多