我的问题是传递给yyerror
的消息已经格式化了(即它实际上是英文解释出了什么问题),而我想得到的只是当前令牌(即前一个令牌)错误伪令牌。)
那怎么弄呢?
我使用gplex / gppg,它们是C#中的lex / yacc实现。
我很抱歉没有100%准确 - 我需要的是令牌(符号)而不是匹配(通过令牌)的正文(文本)。
假设我有一条规则[A-Za-z0-9_]+
构成ID
。所以我想让令牌ID
不是foobar
。
答案 0 :(得分:2)
在我的一个旧项目中找到了这个,重新定义了yyerror:
int yyerror (char *msg) {
printf("oha, %s: '%s' in line %d\n", msg, yytext, yylineno);
return 0;
}
这是一个使用flex / bison的c ++项目,我认为你可以在yytext中找到有趣的东西。
答案 1 :(得分:1)
没有标准,但野牛和大多数版本的yacc将当前令牌存储在yychar
中。不幸的是,这通常是一个局部变量(yyparse
),因此您无法在其他函数(例如yyerror
)中访问它,只能在解析器操作中访问它。
如果你说为什么你想要当前的令牌可能会有所帮助 - 它通常不是一个有用的信息。你提到了错误伪令牌,这没有任何意义,因为它与错误恢复有关,而不是错误本身 - 当它进入图片时通常会丢弃来自输入的一堆令牌。