ANTLR 未生成 ParserBase

ANTLR not generating ParserBase

提问人:Vedanta Mohapatra 提问时间:10/2/2023 更新时间:10/3/2023 访问量:66

问:

我是 ANTLR 的新手,正在这里研究 CPP14 语法。我试过使用

antlr4 -Dlanguage=Python3 CPP14Lexer.g4

antlr4 -Dlanguage=Python3 CPP14Parser.g4

然后使用以下驱动程序代码:

import sys
from antlr4 import *
from CPP14Lexer import CPP14Lexer
from CPP14Parser import CPP14Parser

def main(argv):
    input_stream = FileStream(argv[1])
    lexer = CPP14Lexer(input_stream)
    stream = CommonTokenStream(lexer)
    parser = CPP14Parser(stream)
    tree = parser.start_()

if __name__ == '__main__':
    main(sys.argv)

并且,尝试运行它以解析 cpp 中的 Hello World 代码,但我收到以下错误:

python Driver.py example.cc                                                                                   
Traceback (most recent call last):
  File "/Users/vedantamohapatra/antlr/Driver.py", line 4, in <module>
    from CPP14Parser import CPP14Parser
  File "/Users/vedantamohapatra/antlr/CPP14Parser.py", line 14, in <module>
    from CPP14ParserBase import CPP14ParserBase
ModuleNotFoundError: No module named 'CPP14ParserBase'

我应该如何纠正这个问题?

python antlr antlr4

评论

0赞 kaby76 10/3/2023
grammars-v4 存储库中的许多语法都包含特定于目标的代码。特定于目标的文件放置在以目标命名的目录中,例如 Python3。您必须首先将这些文件复制到语法所在的位置。然后,运行以将语法中的代码替换为 Python3。了解 C++ 使用预处理器。语法不进行预处理器扩展,而只是将它们视为与注释相同。因此,输入可能包含可能导致分析失败的预处理器指令。python transformGrammar.py

答:

1赞 Bart Kiers 10/3/2023 #1

我认为您应该先运行 transformGrammar.py,然后在运行驱动程序文件之前 CPP14ParserBase.py

评论

0赞 Vedanta Mohapatra 10/3/2023
谢谢你,我实际上没有看到 repo 本身有一个 ParserBase。我以为 ANTLR 会为我们生成它
1赞 Bart Kiers 10/3/2023
是的,我可以想象。有时,生成的解析器需要一些特定于目标的代码,在这种情况下,存储库中有一个 base-lexer 和/或 -parser。在这种情况下,在语法的某个地方有一个叫做检查某些内容的方法。此函数的实现是特定于目标的,并在 base-parser 中定义实现。IsPureSpecifierAllowed