Python 如何编写使用rply'读取两行的规则;什么是解析器?
我在编写可以在解析器中读取多行代码的规则时遇到问题 当我打印一行时,输出是正常的,但是如果我尝试打印两行,就会出现错误Python 如何编写使用rply'读取两行的规则;什么是解析器?,python,list,parsing,Python,List,Parsing,我在编写可以在解析器中读取多行代码的规则时遇到问题 当我打印一行时,输出是正常的,但是如果我尝试打印两行,就会出现错误 raise ParsingError(None, lookahead.getsourcepos()) rply.errors.ParsingError: (None, SourcePosition(idx=12, lineno=2, colno=1)) 我正在遵循发布在()的解决方案,但是我认为我没有正确理解响应。我更改了两次ast.py代码,得到了两个不同的错误 解析_ge
raise ParsingError(None, lookahead.getsourcepos())
rply.errors.ParsingError: (None, SourcePosition(idx=12, lineno=2, colno=1))
我正在遵循发布在()的解决方案,但是我认为我没有正确理解响应。我更改了两次ast.py代码,得到了两个不同的错误
解析_gen.py
@self.pg.production('expression : PRINT OPEN_PAREN expression CLOSE_PAREN')
@self.pg.production('program : expression')
@self.pg.production('program : program expression')
def program(p):
return Program(p)
return Print(p[2])
ast.py
class Program():
def __init__(self, value):
self.value = value
def eval(self):
self.value.eval()
class Program():
def __init__(self, value):
self.value = value
def eval(self):
x = self.value
for i in x:
return i.eval()
错误1
AttributeError: 'list' object has no attribute 'eval'
ast.py
class Program():
def __init__(self, value):
self.value = value
def eval(self):
self.value.eval()
class Program():
def __init__(self, value):
self.value = value
def eval(self):
x = self.value
for i in x:
return i.eval()
错误2
AttributeError: 'Token' object has no attribute 'eval'
我还尝试在程序函数中为p添加for循环,但这也带来了第二个错误。我想您缺少的一个重要方面是RPLY决定哪个非终端表示要解析的输入的规则。这就是“启动非终端”,它非常简单:RPLY(与几乎所有解析器生成器一样)只使用它所定义的第一个非终端 在您的例子中,这将是
表达式
,因此您将得到一个解析(一个)表达式的解析器。显然,您想要的是程序
,它解析整个程序(由多个表达式组成)
确实,RPLY文档缺乏细节,尽管它所指的文档(我记得,PLY和Bison)更为详细,而且所有这些生成器都使用相同的解析算法(默认情况下)。要使用RPLY,您需要做更多的研究。但这是你为选择一个记录不良的产品而付出的代价;您可以使用不同的解析器生成器。我觉得OP缺少的远远不止这些,包括产品与函数的关联方式(为什么解析print语句要调用
程序
函数?),以及p
包含的内容(program(p))
显然没有给出它所期望的程序的列表类型,即使p
是程序的一个产品而不是表达式的结果,为什么有两个连续的return
语句没有用。@sepp2k:你可能是对的,但是,为了解决这一特殊问题,连续三次尝试都以产品的订购为特色。我觉得这不是写一本关于如何使用解析器生成器的完整手册的地方,所以我在我准备投入的空间中尽了最大的努力。我确实觉得有一种倾向,就是在不考虑文档是否足够的情况下,就去抢夺最新最不成熟的产品,这就导致了OSS在开发早期(有时是后期)提供良好文档的历史性失败@sepp2k:另一件我一直在咬牙切齿的事情:在你尝试编写编程语言之前先学会编程:-)