2013-09-23 69 views
4

我使用Python Parsimonious Parser試圖爲我設計的簡單語言構建解釋器。我看了這個非常有用的tutorial video,現在我正在慢慢修改代碼以符合我自己的規則。我卡上的分配規則最初定義爲:簡潔解析器 - 試圖解析賦值語法的錯誤

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

我用下面的語法修改規則略有:

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

我想解析器評估SET a, 7例如,同作爲a = 7並將值7綁定到名稱a。然而,當我嘗試分析它,我從圖書館吝嗇得到這個錯誤:

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). 

我是相當新的解析/文法和我完全不知道我是否正確定義的規則。希望有更多解析/練習經驗的人能夠幫助我正確定義規則並解釋我出錯的地方。也許也可以解釋一下Parsimonious的錯誤嗎?

回答

3

當我試圖解析SET a, 7時,我的lvalue規則沒有考慮到SET和左值a之間的空格。這是因爲我將我的lvalue規則定義爲'lvalue = ~"[A-Za-z]+" _',該規則沒有考慮名稱之前的空格。我重新定義了我的分配規則如下,以佔GET與名稱之間的空白:

'setvar = "SETVAR" _ lvalue _ "," _ expr' 

吝嗇似乎喜歡好了很多。

+3

注意:_是另一個規則,定義爲「_ =〜」\ s *「'(即不確定的空格)。 –