括弧と角括弧を区切り記号として使用する文法があります。bison によって生成されたパーサーに、区切り文字のバランスが取れていない入力が与えられた場合、YYLTYPE*
渡された toのエラー位置yyerror
は入力の末尾になります。したがって、たとえば、入力xx(yy
では、void yyerror(YYLTYPE* yylloc, Context* ctx, const char* msg)
私はそれを持っていyylloc->first_column == yylloc->last_column == 5
ます。残念ながら、入力の末尾は、区切り文字の不一致を示す最も顕著な場所ではありません。一致しなかった左括弧または左角括弧の位置は、はるかに便利です。(この例では、オフセット 2 の左括弧になります。) この情報が解析スタックで利用可能であることを収集します。$-n
(
[
@-n
YYLTYPE
その位置を保持する構造体---しかし、そのどれもから利用できないようですyyerror
。区切り文字のオフセットを追跡するために独自のスタックを保持し、Context
I'm already passed toyyerror
にそれを隠しておくことができることは承知していますが、バイソンはすでにこれを追跡しているため、それはエレガントで重複しているように見えます。
では、解析エラーのメッセージを生成するときに使用できるように、入力で最初に遭遇した不均衡な区切り文字の位置を bison からどのように取得できるでしょうか?