我正在使用Antlr 4.5.3和Python 2.7创建一个解析器,并且遇到了其他人已经提到的问题,即解析器不想识别文件的结尾。
以下文章指出这是一个已知错误,并建议在语法的输入规则中明确包含EOF终端符号的解决方案:
ANTLR mismatched input '<EOF>'
所以,很自然地,我这样做了。但是,当我尝试解析规则文件时,我仍然收到错误。
这是我正在测试的玩具语法
grammar TestGrammar;
startRule : (basicRule)+ EOF ;
basicRule : INT ;
INT : [0-9]+ ;
WS : [ \t\r\n]+ -> skip ; // Define whitespace rule, ignore
我使用编译:
antlr4 -Dlanguage=Python2 TestGrammar.g4
我的Python代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from antlr4 import *
from TestGrammarLexer import TestGrammarLexer
from TestGrammarParser import TestGrammarParser
from RuleParserListener import RuleParserListener
import sys
def main(argv):
input = FileStream(argv[1])
lexer = TestGrammarLexer(input)
stream = CommonTokenStream(lexer)
parser = TestGrammarParser(stream)
listener = RuleParserListener()
parser.addParseListener(listener)
parser.startRule()
tree = parser.startRule()
walker = ParseTreeWalker()
walker.walk(listener, tree)
print input
if __name__ == '__main__':
main(sys.argv)
我试图解析的文件(是的,只是带换行符的单个整数值),名为&#39; test.rules&#39;:
19
运行脚本的输出:
> python RuleParser.py test.rules
line 2:0 missing INT at '<EOF>'
19
这是如此基本,我无法理解为什么它不起作用。我已经尝试过在入口规则中有和没有结束EOF,但无济于事。
有没有人知道为什么这不起作用,或者更好的是,有一个解决方案?!
非常感谢!