我試圖用PLY (python implementation of yacc)編寫一個相當簡單的語法,並且在我需要時減少令牌字符串時遇到問題。yacc未能減少(Python Lex-Yacc)
我想解釋一系列採取不同類型的參數命令。每種不同的論點都有不同的標記。令牌所散發出來的lex
字符串可能是這樣的:
COMMAND VARARG VARARG STRARG
COMMAND VARARG STRARG STRARG
我想yacc
到每臺線降低到一個名爲instruction
規則。然而,yacc
拒絕停止減少的最後一個參數(STRARG
)後的第一線,併產生因意外COMMAND
令牌的語法錯誤。
也就是說,而不是減少COMMAND VARARG VARARG STRARG
到instruction
,yacc
轉變一個更多的時間來COMMAND VARARG VARARG STRARG COMMAND
(從下一行,這不應該被讀取拿起最後COMMAND
)。
我的代碼yacc
部分看起來是這樣的:
def p_rule1(p):
r'instruction : COMMAND VARARG VARARG STRARG'
# do stuff
def p_rule2(p):
r'instruction : COMMAND VARARG STRARG STRARG'
# do other stuff
我在我的規則規範使得一些明顯的錯誤?這是我第一次用lex
/yacc
,所以我也不會感到驚訝。
不幸的是,當我再補充一點規則,我的代碼,它永遠不會被使用。我認爲這是因爲它仍然不會將任何東西都減少到`instruction`,因此`instructions`規則從不會在棧上看到`instruction`。如果我打開調試(新規則),堆棧進度樣子:`COMMAND` - >`命令VARARG` - >`命令VARARG VARARG` - >`命令VARARG VARARG STRARG` - >`命令VARARG VARARG STRARG COMMAND `(因爲多餘的`COMMAND`而在這裏失敗)。在轉移最後一個`COMMAND`之前,'yacc`是否已經將`COMMAND VARARG VARARG STRARG`減少爲`instruction`? – Ael 2011-02-03 16:18:48