如何在.y文件中定义YYERROR_VERBOSE

时间:2015-10-30 07:17:34

标签: bison

我正在使用野牛解析器。

要在错误消息中获取预期和意外的令牌名称,需要在生成的y.go文件中设置变量YYERROR_VERBOSE。如何从.y文件中设置它?

1 个答案:

答案 0 :(得分:4)

这是一个语法片段

%{
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdarg.h>
    #include <strings.h>
    #include "calc.h"

    int yylex(void);    
    void yyerror(char *s);
    symrec * symTable;
    /**
        temporary variable declarations
    */
    linkedList * temp_list = NULL;
    linkedList * programRoutineList = NULL;
    linkedList * argList = NULL;
    program * prg;

%}
%error-verbose

%union {
    int iValue;                 
    symrec * sRec;
    nodeType *nPtr;

    basicType basic;  
    parameter *parameter;
    routine * routine;
    linkedList *list;       
};                          

%token <iValue> INTEGER         
%token <sRec> VARIABLE
%token WHILE IF PRINT FOR TO
%nonassoc IFX
%nonassoc ELSE
…
…

这是yacc文件的开头。这是yacc源文件的一部分是声明部分,正如您所读,用户可以定义几乎任何类型的有用内容(符合C标准)。

作为指令的一部分,您可以看到%error-verbose指令,该指令由yacc解释为在信令错误中更加“用户”错误友好的指令。有关此类指令的更详细视图,请查看error-verbose the bison manual(请记住使用谷歌:它知道很多东西;)

有关完整示例,请查看this error tracker example。您需要error_tracker_lexer.l和error_tracker.y才能使其正常工作。您可以在同一目录中找到它们。 编译后,可以将其用作my_exec&lt; input_error_tracker ... 预期的输出是

at line 2 follows detail on columns--> 2.3-2.4: division by zero
returning 1 as default action

好的,您可以构建自己的文件,例如:89 + ad

输出将是

syntax error, unexpected '\n', expecting NUM or '-' or '('

希望这会有所帮助..