1

My problem is that the message passed to yyerror is already formatted (i.e. it is actually an English explanation what went wrong), and what I would like to get is just the current token (i.e. the one before the error pseudo-token).

So how to get it?

I use gplex/gppg which are lex/yacc implementations in C#.


I am sorry for not being 100% precise -- what I need is token (symbol) not the body (text) which was matched (by the token).

Let's say I have a rule [A-Za-z0-9_]+ constitutes an ID. So I would like to get token ID not a foobar.

4

2 回答 2

2

在我的一个旧项目中找到了这个,重新定义了 yyerror:

int yyerror (char *msg) {
  printf("oha, %s: '%s' in line %d\n", msg, yytext, yylineno);
  return 0;
}

这是一个使用 flex/bison 的 c++ 项目,我认为你可以在 yytext 中找到有趣的东西。

于 2012-11-06T20:12:25.643 回答
1

没有标准,但是 bison 和大多数版本的 yacc 将当前令牌存储在yychar. 不幸的是,这通常是一个局部变量 (of yyparse),因此您无法在其他函数 (例如yyerror) 中访问它,只能在解析器操作中访问它。

如果您说为什么要使用当前令牌,这可能会有所帮助——它通常不是有用的信息。您提到了错误伪标记,这没有任何意义,因为它与错误恢复相关联,而不是错误本身——当它进入图片时,通常输入中的一堆标记已被丢弃。

于 2012-11-06T22:23:25.020 回答