如何获取有关 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,你的问题并没有说明你的学习进度。
我刚从 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,你的问题并没有说明你的学习进度。