如何获取有关 Bison 中发生的错误的任何其他信息?

How to get any additional info about the occurred error in Bison?

我刚从 Flex/Bison 开始,我正在尝试翻译类似 pascal 的变量声明,如下所示:

VAR
    V1: INT;
    V2: INT;
END_VAR

像这样的 C 变量声明:

int main ()
{
    int V1;
    int V2;
}

我编写了描述所需语法的 lex 和 yacc 文件,然后在 cmd 中使用 flex、bison 和 gcc 实用程序对其进行了编译。这一切都没有错误地完成。但是当我尝试在可执行文件中推送带有多个变量声明的代码文件(与第一个代码示例相同)时,我只会在 cmd 中出现“语法错误”。我不知道如何获取有关此错误的任何其他信息,尽管代码必须非常简单。

---更新---

我使用了 Öö Tiib 答案,它有助于获取有关错误的信息。

我正在寻找我的 lex 文件中的一个错误:程序需要 ':' 字符,但它遇到了一些未定义的字符。那是因为正则表达式中的 space 字符 [; j] 导致词法分析器将其识别为标记,尽管白色 spaces 应该被忽略,如正则表达式 [\t\n] 中所写。这就是 lex 文件的样子:

%{
    #include "parser.tab.h"
    #include <string.h>
%}

%%
[a-z]([a-z]|[0-9])* {
    strcpy (yylval.var, yytext);
    return ID;
}

"VAR"               { return VAR; }
"END_VAR"           { return END_VAR; }
"INT"               { return INT; }
[:;]                { return *yytext; }
[ \t\n];
%%

int yywrap ()
{
    return 1;
}

要获得更多信息错误字符串,您需要在 yacc 文件中 %error-verbose。也许像你的文件中那样:

%{
    #include <stdio.h>

    extern FILE * yyout;
    extern char * yylex ();
    void yyerror (char *s);
%}
%error-verbose

%union
{
    int number;
    char var [10];
}

...

更多关于错误分析的信息在manual,你的问题并没有说明你的学习进度。