我有一個使用括號和方括號作爲分隔符的語法。當由野牛產生的解析器給定的輸入與不平衡定界符,在YYLTYPE*
傳遞給yyerror
錯誤位置是輸入的結束。所以,例如,在輸入xx(yy
,void yyerror(YYLTYPE* yylloc, Context* ctx, const char* msg)
我有那yylloc->first_column == yylloc->last_column == 5
。不幸的是,輸入的結束並不是用於指示不匹配的分隔符的最顯着的位置。更有用的是左側括號或左側方括號中沒有匹配的位置。 (在這個例子中,這將是偏移量爲2的左括號。)我收集到,這個信息在解析堆棧中是可用的 - 必須有一些n,使得$-n
是無與倫比的(
或[
令牌和@-n
是YYLTYPE
結構保持自己的立場---但沒有出現,可購自yyerror
。我知道我可以保留一堆自己的追蹤分隔符的偏移量,並將其保存在Context
我已經傳遞到yyerror
,但這看起來不雅觀和重複性,因爲野牛必須跟蹤這個。如何找到yacc/bison中的錯誤報告的不平衡分隔符?
所以:如何能一個獎開出野牛第一不平衡定界符遇到的輸入,使得對於分析錯誤產生的消息時,這是可用的位置的?
你能分享你的語法(它至少部分被處理括號)? – Josh 2013-04-11 13:58:07
這是[這裏](https://github.com/uckelman/liblightgrep/blob/ccsetops/src/lib/parser.ypp)。括號在第187行處理。 – uckelman 2013-04-11 18:43:38