【问题标题】:How to get any additional info about the occurred error in Bison?如何获取有关 Bison 中发生的错误的任何其他信息?
【发布时间】:2021-12-24 18:55:01
【问题描述】:

我刚开始使用 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 文件中的一个错误:程序需要 ':' 字符,但它遇到了一些未定义的字符。那是因为正则表达式中的空格字符 [; j] 导致词法分析器将其识别为标记,尽管应忽略空格,如正则表达式 [ \t\n] 中所写。这就是 lex-file 的样子:

%{
    #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;
}

【问题讨论】:

    标签: c++ parsing bison


    【解决方案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,你的问题并不表明你的学习有多远。

    【讨论】:

    • 这就是我想要的。手册的“错误报告”部分没有提到%error-verbose 命令,所以很容易跳过它。但我设法找到了它的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2011-03-17
    • 1970-01-01
    相关资源
    最近更新 更多