C 扫描程序-分析器错误:yylval未定义
我正在尝试构建一个扫描分析器来处理像这样的输入x1+x2+x3+x4;我被这个错误阻止了。我理解,当您在flex flex2.y文件中声明一个联合时,yylval将与该联合连接,并且在编译文件flex2.y后,将在同一文件夹中创建该联合。一个是flex2.tab.y,另一个是flex2.tab.h。因此,在此之后,我必须在flex2.l文件中包含flex2.tab.h文件,以便我可以在flex2.l文件中使用yylval来返回令牌的值。但由于某些原因,.l文件无法识别yylval。如果有人能指出我的错误,我将非常感激 flex2.y代码:C 扫描程序-分析器错误:yylval未定义,c,parsing,visual-studio-2008,unions,lexical-analysis,C,Parsing,Visual Studio 2008,Unions,Lexical Analysis,我正在尝试构建一个扫描分析器来处理像这样的输入x1+x2+x3+x4;我被这个错误阻止了。我理解,当您在flex flex2.y文件中声明一个联合时,yylval将与该联合连接,并且在编译文件flex2.y后,将在同一文件夹中创建该联合。一个是flex2.tab.y,另一个是flex2.tab.h。因此,在此之后,我必须在flex2.l文件中包含flex2.tab.h文件,以便我可以在flex2.l文件中使用yylval来返回令牌的值。但由于某些原因,.l文件无法识别yylval。如果有人能指出
%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int yyerror(char *message)
{
return 0;
}
%}
%union {
double val;
char sym;
}
%token <val> NUMBER
%token <sym> PLUS Q_MARK
%type <val> addition_list addition
%start addition_list
%%
addition_list : addition Q_MARK {printf("apotelesma: %d\n", $1);}
| addition_list addition Q_MARK {}
;
addition : NUMBER PLUS NUMBER {$$ = $1 + $3;}
| addition PLUS NUMBER {$$ = $1 + $3;}
;
%%
void main(int argc, char *argv[])
{
yyparse();
}
这里是flex2.tab.h的内容,我注意到它在某处写着typedef YYSTYPE,但据我所知,这个联合体是由yylval管理的
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
NUMBER = 258,
PLUS = 259,
Q_MARK = 260
};
#endif
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
/* Line 1676 of yacc.c */
#line 14 ".\\flex2.y"
double val;
char sym;
/* Line 1676 of yacc.c */
#line 64 "flex2.tab.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif
extern YYSTYPE flex2lval;
你给野牛什么选择?似乎您正在指定
-p flex2
(或--名称前缀flex2
)。您好,我在哪里可以检查?(可能是bison文件的属性?)bison Parser->命令行->那里只有这一行bison.exe-b flex2-d-p flex2就像我说的,您正在指定-p flex2
。你为什么这么做?我在visual studio选项中没有做任何更改。事实上,我正在努力解决大学里的一个练习。关于如何做到这一点,有一些指导方针。他们没有说要搞乱具体的选项,所以我没有改变它。我必须改变一些东西,这样它才能工作?正如你所理解的,我不知道-p是什么意思:/我只是用来写代码。
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
NUMBER = 258,
PLUS = 259,
Q_MARK = 260
};
#endif
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
/* Line 1676 of yacc.c */
#line 14 ".\\flex2.y"
double val;
char sym;
/* Line 1676 of yacc.c */
#line 64 "flex2.tab.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif
extern YYSTYPE flex2lval;