我有一个使用括号和方括号作为分隔符的语法。当给野牛生成的解析器输入带有不平衡分隔符的输入时,YYLTYPE*
传递到的错误位置yyerror
是输入的结尾。因此,例如,在 inputxx(yy
中,void yyerror(YYLTYPE* yylloc, Context* ctx, const char* msg)
我有 that yylloc->first_column == yylloc->last_column == 5
。不幸的是,输入的结尾并不是指示不匹配分隔符的最显着位置。更有用的是不匹配的左括号或左方括号的位置。(在示例中,这将是偏移量 2 处的左括号。)我认为此信息在解析堆栈中可用 --- 必须有一些n是$-n
不匹配的(
或[
令牌,并且@-n
是YYLTYPE
保持其位置的结构——但似乎没有一个可以从yyerror
. 我知道我可以保留自己的堆栈来跟踪定界符的偏移量并存储在Context
I 已经传递到 中yyerror
,但这似乎不雅和重复,因为野牛已经在跟踪这个。
那么:如何从野牛中获得它在输入中遇到的第一个不平衡分隔符的位置,以便在生成解析错误消息时可用?