我使用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 space
或require 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對我作爲關鍵字提供的特定字符串很敏感。我錯過了什麼嗎?任何幫助/提示/意見將不勝感激!
實際上,某些單詞的工作原理與其他單詞不一樣的原因是PLY的標記器嘗試按其長度順序匹配正則表達式。由於'\ w +'是三個字母,因此只有三個字母以上的記號纔有機會匹配。 話雖如此,您爲WORD定義的代碼確實是正確的解決方案。 來源:我是PlyPlus的作者 – Erez