2010-11-21 54 views
0

嗨,我是用野牛一所學校的項目,但我有一個問題,我得到了下一個規則:野牛推導爲了

callsubrotina : callfunction | callprocedure; 

callprocedure: 
     T_IDENTIFICADOR 
     {identifier_check(GOTO, $1, TIPO_PROCEDIMENTO);} 
    | T_IDENTIFICADOR T_PARENTESE_E listaexpressoes T_PARENTESE_D 
     {identifier_check(GOTO, $1, TIPO_PROCEDIMENTO);} 
    ; 

callfunction: 
     T_IDENTIFICADOR 
     {identifier_check(LD_VAR, $1, TIPO_FUNCAO);} 
    | T_IDENTIFICADOR T_PARENTESE_E listaexpressoes T_PARENTESE_D 
     {identifier_check(LD_VAR, $1, TIPO_FUNCAO);} ; 

問題是野牛總是轉到「callprocedure」即使這觸發錯誤。我如何強制它檢查兩條規則?或者我如何創建一個規則來正確對待? PS:對不起,英國人不好。

回答

0

由於'callprocedure'和'callfunction'的語法在所顯示的規則中是相同的,因此Bison(或任何其他類似的工具)無法區分它們。

你必須有一個概念上的差異 - 也許一個過程沒有返回任何值,並且函數返回一個值。但除非有某種語法方式可以確定某個特定的調用屬於某個函數,而不屬於某個過程,否則您將始終獲得第一個執行的書面規則。您還應該收到有關未使用規則的警告。一個可能性:如果你的函數和過程必須在它們被調用之前被聲明,所以你可以判斷一個給定的名字是否屬於一個函數或過程,那麼你可以修改詞法分析器來說'這是一個函數NAME'和'那是一個PROCEDURE NAME',然後語法可以是:

callsobrotina: callprocedure | callfunction ; 

callprocedure: 
     T_PROCEDURE_NAME 
    | T_PROCEDURE_NAME T_PARETESE_E listaexpressoes T_PARENTES_D 
    ; 

callfunction: 
     T_FUNCTION_NAME 
    | T_FUNCTION_NAME T_PARETESE_E listaexpressoes T_PARENTES_D 
    ;