简约解析器-尝试解析分配语法时出错

raf*_*afi 5 python parsing peg parsimonious

我正在使用Python Parsimonious Parser尝试为我正在设计的一种简单语言构建解释器。我观看了本教程视频,该视频非常有帮助,现在我正在慢慢修改代码以符合我自己的规则。我受困于最初定义为的分配规则:

def assignment(self, node, children):
    'assignment = lvalue "=" expr'
    lvalue, _, expr = children
    self.env[lvalue] = expr
    return expr
Run Code Online (Sandbox Code Playgroud)

我使用以下语法对规则进行了少许修改:

def assignment(self, node, children):
    'assignment = "SET" lvalue "," expr'
    _, lvalue, _, expr = children
    self.env[lvalue] = expr
    return expr
Run Code Online (Sandbox Code Playgroud)

我希望解析器进行评估SET a, 7,例如,与解析器相同,a = 7并将值绑定7到name a。但是,当我尝试解析它时,我从Parsimonious库中得到了以下错误:

parsimonious.exceptions.IncompleteParseError: Rule 'program' matched in its 
entirety, but it didn't consume all the text. The non-matching portion of 
the text begins with 'SET a, 7' (line 1, column 1).
Run Code Online (Sandbox Code Playgroud)

我是解析/词法分析的新手,不确定我是否正确定义了规则。希望有人能提供更多的解析/词法处理经验,可以帮助我正确定义规则并解释我出了什么问题。还可以向我解释简约错误吗?

raf*_*afi 3

当我尝试解析时SET a, 7,我的lvalue规则没有考虑SET和 左值之间的空格a。这是因为我将lvalue规则定义为'lvalue = ~"[A-Za-z]+" _'不考虑名称之前的空格。我重新定义了分配规则,如下所示,以考虑GET和 名称之间的空格:

'setvar = "SETVAR" _ lvalue _ "," _ expr'
Run Code Online (Sandbox Code Playgroud)

简约似乎更喜欢这样。

  • 注意: _ 是另一个规则,定义为 `'_ = ~"\s*"' (即不定空格)。 (3认同)