首页 > 解决方案 > 自添加打印以来的 RPLY 无效令牌错误

问题描述

所以我正在使用 python 制作一种简单的玩具语言,我的代码中出现以下错误:

Traceback (most recent call last):
  File "e:/ParserAndLexer/main.py", line 14, in <module>
    result = parser.parse(lexer.lex(command)).eval()
  File "C:\Python38\lib\site-packages\rply\parser.py", line 60, in parse
    self.error_handler(lookahead)
  File "e:\ParserAndLexer\main_parser.py", line 46, in error_handle
    raise ValueError(f"Invalid token {token}")
ValueError: Invalid token Token('INTEGER', '5')

自从我在解析器中添加了打印语句后,这个错误才开始发生,在那之前我的代码运行良好。我使用它如下

print(parser.parse(lexer.lex('5 + 5')).eval())

当我使用 print 语句时,我得到以下输出。

print(parser.parse(lexer.lex('print(5 + 5)')).eval())

>>> 10
>>> None

我不知道 None 是从哪里来的。我的代码在这个粘贴中。

标签: python-3.xparsing

解决方案


我发现你的问题有点难以理解。首先你说解析抛出了一个异常,然后你展示了解析按预期工作(除了你显然不希望 print 函数打印它的参数)。

但我猜你的意思是当你修改语法以包含一个print语句时,它会在以前接受的输入上引发错误。

先说第二个问题:返回的ASTNone的方法返回的值是多少。在返回之前,通过打印参数来实现语句。 然后打印,因为您打印了该方法返回的值。(您可能想要禁止打印而不是打印 eval 返回的任何内容。)evalparser.parseevalprintNoneevalNone

如果您的意思是新语法不接受旧语法接受的内容,那可能是因为旧语法接受了一个表达式作为输入。也许最初的第一条规则是Program : expression或者第一条规则是针对expression非终端的规则。没有看到旧语法也很难说。但很明显,您的新语法指定Program为开始符号,并且Program只匹配以 token 开头的输入print。如果第一个标记是其他东西,例如整数 5,您可能会产生语法错误,因为没有Program适用的产生式。

如果您希望生成的解析器接受一个print语句或一个简单的表达式,您需要添加一个允许它的产生式。


推荐阅读