使用ANTLR解析Python文件遇InputStream及<EOF>错误求助
解决ANTLR4 Python解析器的文件传入及EOF错误问题
一、直接传入.py文件的正确方式
无需手动读取文件内容,ANTLR的Python运行时提供了FileStream类,可直接加载.py文件作为输入流,替代InputStream,既简洁又能避免手动读取可能的编码问题。
示例代码:
from antlr4 import FileStream, CommonTokenStream from Python3Lexer import Python3Lexer from Python3Parser import Python3Parser def main(): # 直接用FileStream加载目标.py文件,指定编码确保正确读取 input_stream = FileStream('your_script.py', encoding='utf-8') lexer = Python3Lexer(input_stream) stream = CommonTokenStream(lexer) parser = Python3Parser(stream) # 使用文件专用的语法入口(下文会解释) tree = parser.file_input() print(tree.toStringTree(recog=parser)) if __name__ == '__main__': main()
二、解决EOF相关错误
你遇到的mismatched input <EOF>或no viable alternative as input <EOF>错误,核心原因是调用了错误的语法入口方法:
single_input是为Python交互式环境设计的单行输入入口,仅支持单行语句/表达式结构,当解析完整.py文件时,文件结尾的EOF会不符合单行输入的规则,触发错误。file_input是ANTLR Python3.g4中专门用于解析完整Python模块/文件的入口,支持多行代码、类定义、函数定义等完整文件结构,替换后即可解决EOF匹配问题。
只需将代码中的parser.single_input()替换为parser.file_input()即可。另外需确保要解析的.py文件包含合法的Python代码内容,空文件也会触发EOF错误。
内容的提问来源于stack exchange,提问作者Fari
相关产品推荐
相关产品推荐

