2015-05-08 30 views
0

我使用plyplus來設計一個簡單的語法,我一直在努力處理一些奇怪的錯誤。請記住我是一個新手。下面是一段代碼,重現該問題:由於特定的關鍵字,Plyplus給出語法錯誤?

from plyplus import Grammar 

list_parser = Grammar(""" 
    start: context* ; 
    context : WORD '{' (rule)* '}' ; 
    rule: 'require' space_marker ; 
    space_marker: 'newline' 
     | 'tab' 
     | 'space' 
     ; 

    WORD: '\w+' ; 
    SPACES: '[ \t\n]+' (%ignore) ; 
    """, auto_filter_tokens=False) 

res = list_parser.parse("test { require tab }") 

如果我輸入的字符串包含require spacerequire newline,它完美的罰款。但是,只要我提供require tab,拋出一個異常:

Traceback (most recent call last): 
    File "/Users/bore/Projects/ThesisCode/CssCoco/coco/plytest.py", line 18, in <module> 
    res = list_parser.parse("test { require tab }") 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/plyplus/plyplus.py", line 584, in parse 
    return self._grammar.parse(text) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/plyplus/plyplus.py", line 668, in parse 
    raise ParseError('\n'.join(self.errors)) 
plyplus.plyplus.ParseError: Syntax error in input at 'tab' (type WORD) line 1 col 16 

諷刺的是,我不我每次運行該代碼時得到這個例外,但在三次一次。我注意到,如果將語法和輸入從tab更改爲ta,則每次運行代碼時都會得到相同的異常。另外,如果我將其更改爲tabb,則錯誤消失。

錯誤提示tab被解析爲WORD而不是space_marker。但是,tabb也是一個WORD。從我的試驗和錯誤看來,plyplus對我作爲關鍵字提供的特定字符串很敏感。我錯過了什麼嗎?任何幫助/提示/意見將不勝感激!

回答

0

PlyPlus是PLY的一個實現,其中L和Y代表Lex和Yacc,所以它更好 - probably worse - 一個LR解析器,它嚴格按照自下而上的方式工作。這也意味着'tab'不能被解析爲TAB(或_ANON_X,或者它爲token生成的任何名稱),因爲您對WORD的定義非常慷慨。唯一的解決辦法是使定義更具限制性。例如:

WORD: '\w+' (%unless 
    TAB: 'tab'; 
    REQ: 'require'; 
); 

我的猜測是,它適用於'newline''space'因爲有一個隱含定義preterminal某處它得到分配比WORD更高的優先級,但PlyPlus的文件是不完全的頂級要麼,所以人們不得不看看PlyPlus的記號器的實際實現。

+1

實際上,某些單詞的工作原理與其他單詞不一樣的原因是PLY的標記器嘗試按其長度順序匹配正則表達式。由於'\ w +'是三個字母,因此只有三個字母以上的記號纔有機會匹配。 話雖如此,您爲WORD定義的代碼確實是正確的解決方案。 來源:我是PlyPlus的作者 – Erez

相關問題