如何在yyerror中获取当前令牌?

时间:2012-11-06 20:00:28

标签: error-handling syntax-error token yacc lex

我的问题是传递给yyerror的消息已经格式化了(即它实际上是英文解释出了什么问题),而我想得到的只是当前令牌(即前一个令牌)错误伪令牌。)

那怎么弄呢?

我使用gplex / gppg,它们是C#中的lex / yacc实现。


我很抱歉没有100%准确 - 我需要的是令牌(符号)而不是匹配(通过令牌)的正文(文本)。

假设我有一条规则[A-Za-z0-9_]+构成ID。所以我想让令牌ID不是foobar

2 个答案:

答案 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)中访问它,只能在解析器操作中访问它。

如果你说为什么你想要当前的令牌可能会有所帮助 - 它通常不是一个有用的信息。你提到了错误伪令牌,这没有任何意义,因为它与错误恢复有关,而不是错误本身 - 当它进入图片时通常会丢弃来自输入的一堆令牌。