2012-10-31 36 views
1

語法錯誤,這只是一個例子YACC表示在錯誤的位置

YACC語法:

abc:ABC STRING NEWLINE 

end:END 

. 

. 

法文件:

int lineno=1; 

. 

. 

string [a-zA-Z]+ 

%% 

ABC {return ABC;} 

END {return END;} 

[\n] {lineno++;return NEWLINE;} 

{string} {return STRING;} 

%% 

和在NEWLINE LINENO的每一次出現被遞增 如果輸入文件是:

ABC xyz 

END 

YACC解析這個成功

如果輸入文件是:

ABC 123 

END 

它顯示1行:語法錯誤

這是預期

,但如果輸入文件是:

ABC 

END 

那麼它顯示2號線:語法錯誤

但是誤差在1號線不符合2

可以做些什麼,以便顯示正確的路線沒有?

回答

3

因爲解析器在收到詞法分析器中的NEWLINE標記之前沒有找到錯誤,並且您已經增加了行號。

這實際上並不罕見,在錯誤的行上顯示錯誤。一個很好的例子,如果你忘記把一個分號(;)放在C語言源文件的語句末尾。該錯誤很可能在下一行。

編輯: Yacc錯誤恢復處理。

Yacc有一個特殊的終端符號error它可以用於錯誤恢復。在你的情況下,它可以使用這樣的:

abc:ABC STRING NEWLINE 
    |error NEWLINE 
    ; 

您可以添加的errorNEWLINE符號之間的代碼塊打印錯誤消息,但可能無法工作,反正作爲分析器不知道有是一個錯誤,直到它看到了NEWLINE符號。

+0

有什麼辦法可以檢查NEWLINE之前發生的這種缺失值嗎? – Tanya

+0

@Tanya您可以添加一個帶有特殊錯誤終端符號的規則,但它可能無法正常工作。 –

+0

可以將錯誤報告爲:上述情況下的「ABC錯誤」? – Tanya

0

您可以保守地將您的語法錯誤消息說成是類似於「行號%d附近的語法錯誤」。