2011-02-02 104 views
1

我試圖用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 STRARGinstructionyacc轉變一個更多的時間來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,所以我也不會感到驚訝。

回答

1

您需要包括額外的規則來處理多條指令,這樣YACC就知道如何處理第二個命令令牌做。像下面的東西應該工作。

instructions : instructions '\n' instruction 
      | instruction 

instruction : COMMAND VARARG VARARG STRARG 
      { do stuff } 
      | COMMAND VARARG STRARG STRARG 
      {do other stuff } 

http://luv.asn.au/overheads/lex_yacc/yacc.html#recusive

+0

不幸的是,當我再補充一點規則,我的代碼,它永遠不會被使用。我認爲這是因爲它仍然不會將任何東西都減少到`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