Error handling 如何在错误中获取当前令牌?

Error handling 如何在错误中获取当前令牌?,error-handling,syntax-error,token,yacc,lex,Error Handling,Syntax Error,Token,Yacc,Lex,我的问题是,传递给yyerror的消息已经格式化(即,它实际上是错误的英文解释),我想要得到的只是当前标记(即错误伪标记之前的标记) 那么如何得到它呢 我使用gplex/gppg,它们是C#中的lex/yacc实现 我很抱歉没有100%准确——我需要的是标记(symbol),而不是匹配的正文(text) 假设我有一条规则[a-Za-z0-9.]+构成一个ID。所以我想得到令牌ID而不是foobar 在我的一个老项目中发现了这个错误,并重新定义了一个错误: int yyerror (char *

我的问题是,传递给
yyerror
的消息已经格式化(即,它实际上是错误的英文解释),我想要得到的只是当前标记(即错误伪标记之前的标记)

那么如何得到它呢

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


我很抱歉没有100%准确——我需要的是标记(symbol),而不是匹配的正文(text)


假设我有一条规则
[a-Za-z0-9.]+
构成一个
ID
。所以我想得到令牌
ID
而不是
foobar

在我的一个老项目中发现了这个错误,并重新定义了一个错误:

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

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

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


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

谢谢,我不太准确,抱歉
yytext
给出令牌的内容,而不是令牌本身。Hmm。再次查看那个旧项目,我在lexer文件中所做的不是“{”return LCB;我使用了“{”return isWat(LCB);。在这个isWat例程中,我检查我在上面的yyrerror例程中设置的错误标志(我删除了该代码以避免混淆),如果set只输出令牌id。当然这是一点工作,因为每个令牌都是通过isWat例程返回的。但是它工作了。但是可能有更好的解决方案……再次感谢。到目前为止,我做了一些黑客操作——我看了一下消息的格式,并获得了对令牌字段的直接访问。谢谢。我希望当前令牌显示自定义消息,因此我要么解析回消息,要么获取消息的组件,然后显示我自己的消息。为了使用旧项目进行自动测试,我必须有自己的消息。否则,使用每个工具(Bison、Yacc、CUP,您可以命名)你必须跳出大范围来确定你的输出是否仍然是一样的。错误伪令牌是有意义的,我提到它是为了避免回答“嘿,当前令牌是错误令牌”@macias:对于自定义错误消息,通常您需要的是
yytext
——最后匹配的令牌的文本,而不是令牌代码。但是您明确表示不需要文本。天哪,谢谢您告诉我我想要什么。请尊重他人的需要,事实上有些不寻常,并不意味着您必须强制这样或那样做解决方案或POV。我需要令牌代码,句号。