簡體   English   中英

Bison:語法錯誤處理,意外和未定義<token>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM