[英]Bison: Syntax Error processing, unexpected and undefined<token>
例如,我想在 yyerror func 中處理未定義和意外的令牌錯誤(或者如果可能的話,可能由另一個 func 處理),我從 Bison 收到一條錯誤消息
...
LAC: checking lookahead EXECSQL: S4
Error: popping nterm component_list ()
Stack now 0
Cleanup: discarding lookahead token $undefined ()
Stack now 0
ERRSTAT = "%X0000002C"
但我想打印尚未建立的令牌和行號。 是否可以在 Bison 中實現它以及如何實現?
當yylex
返回一個沒有出現在任何解析器規則中的標記號時,會報告特殊標記$undefined
。 大多數時候,這是詞法分析器回退規則的結果:
. { return yytext[0]; }
但是,如果您在解析器文件中聲明一個標記,並且詞法分析器返回該標記,但該標記實際上從未在任何規則中使用,也會發生這種情況。
未使用的標記沒有名稱,因為 Bison 包含在您的解析器中的名稱數組不包含未使用的標記,因此無法查找最初的標記名稱。 但是,您通常可以從變量yychar
獲取令牌編號。 如果該數字大於 0 且小於 256,則該標記可能是單字符標記,您可以使用它來打印附加錯誤消息。 但是,沒有簡單的方法可以修改由 Bison 的冗長錯誤消息生成的錯誤消息; 如果您正在使用該功能,您仍會看到無效令牌消息。
為了打印行號,你只需要在詞法掃描器中啟用行號計數,使用
%option yylineno
在您的 Flex ( .l
) 文件中。 然后你可以在yyerror
打印yylineno
的值。 (如果您使用的是“純”(可重入)掃描儀,則yylineno
將位於scanner_t
對象中。在該對象是額外解析器參數的正常用例中,它也將在yyerror
可用。)
我知道上面的內容有點令人困惑,因為有很多不同的代碼生成選項,它們的行為略有不同。 您沒有指定正在使用的特定選項,因此答案有點籠統。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.