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