2016-11-18 26 views
1

我在bison分析器中使用flex分析器來解析輸入文件中的詞位。 Flex解​​析器檢測到一些錯誤(即未關閉的括號或不可接受的符號)。我想從flex通知bison解析器發生錯誤,語法解析失敗。現在我用這樣的代碼.L文件如何將彈性錯誤提升爲野牛

RegExpForInvalidChars: {yyerror("Unaccaptable char")}; 

但野牛時調用函數yylex取得的空語義(因爲我不返回任何值),並忽略了它。如此糟糕的符號只是被跳過而解析正在進行。

回答

1

通常的方式就是讓規則:

. { return *yytext; } 

在你的詞法規則的結束。這樣,任何不是有效詞位(部分)的單個字符都將直接返回到野牛語法,這將導致語法錯誤。如果您啓用野牛的詳細錯誤消息,則語法錯誤將包含實際無效字符。

0

最簡單的方法是簡單地通過一個它不識別的bison一個詞位。這將是或多或少自動,如果你使用標準的後備規則:

.|\n  { return yytext[0]; } 

,因爲該規則將只返回一個無法識別的標記字符串的第一個字符。

當解析器收到一個它無法識別的令牌值時,它會立即報告語法錯誤。

在幾乎所有的應用程序中,詞法分析器既沒有必要也沒有最佳實踐來嘗試識別解析器將檢測到的錯誤。例如,大多數語法在包含非平衡括號的輸入上會失敗,因此用邏輯來擴充詞法分析器以維護括號計數是不必要的。此外,如果您最終決定試圖在解析器中實現錯誤恢復,則會發現它與掃描器中執行的狀態跟蹤嚴重相互影響。