python-3.x - 自添加打印以来的 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 是从哪里来的。我的代码在这个粘贴中。
解决方案
我发现你的问题有点难以理解。首先你说解析抛出了一个异常,然后你展示了解析按预期工作(除了你显然不希望 print 函数打印它的参数)。
但我猜你的意思是当你修改语法以包含一个print
语句时,它会在以前接受的输入上引发错误。
先说第二个问题:返回的ASTNone
的方法返回的值是多少。在返回之前,通过打印参数来实现语句。 然后打印,因为您打印了该方法返回的值。(您可能想要禁止打印而不是打印 eval 返回的任何内容。)eval
parser.parse
eval
print
None
eval
None
如果您的意思是新语法不接受旧语法接受的内容,那可能是因为旧语法接受了一个表达式作为输入。也许最初的第一条规则是Program : expression
或者第一条规则是针对expression
非终端的规则。没有看到旧语法也很难说。但很明显,您的新语法指定Program
为开始符号,并且Program
只匹配以 token 开头的输入print
。如果第一个标记是其他东西,例如整数 5,您可能会产生语法错误,因为没有Program
适用的产生式。
如果您希望生成的解析器接受一个print
语句或一个简单的表达式,您需要添加一个允许它的产生式。
推荐阅读
- python - 如何从 Prophet 模型制作的“AxesSubplot”中提取数据
- material-ui - material-ui 自动完成包装到 react-hook-form 控制器中,无法获取值
- c# - 检查上传的文件是图像还是不使用 asp.net web api
- c# - 如何按值获取节点的索引
- node.js - 节点函数未在 lambda 中执行某些行
- html - 为html中的数据输入创建一个类似表格的表格,该表格将插入到sql中
- typescript - 如何在不更改 GMT 时区的情况下将字符串转换为日期
- java - 这在 android 回收器视图适配器 Intent 中不起作用
- c# - 在 C# 中与父子对象迭代地保存分层(树视图)对象
- c - 为什么经过几次迭代后输出中有 -nan