Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何编写使用rply'读取两行的规则;什么是解析器?_Python_List_Parsing - Fatal编程技术网

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:另一件我一直在咬牙切齿的事情:在你尝试编写编程语言之前先学会编程:-)