我正在尝试构建一个扫描程序解析器来处理像x1 + x2 + x3 + x4这样的输入;我被这个错误阻止了。据我所知,当您在flex flex2.y文件中声明一个union时,yylval与此union连接,并且在您编译文件后,flex2.y会在同一文件夹上创建2个文件。一个是flex2.tab.y,另一个是flex2.tab.h。所以在那之后我必须在flex2.l文件中包含flex2.tab.h文件,这样我就可以在flex2.l文件中使用yylval来返回标记的值。但由于某种原因,.l文件无法识别yylval。如果有人可以指出我的错误,我会非常感激。
flex2.y代码:
%{
#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.l代码:
%option noyywrap
%{
#include "flex2.tab.h"
%}
%%
\+ { yylval.sym = yytext[0]; return PLUS; }
; { yylval.sym = yytext[0]; return Q_MARK; }
0|([-+]?(([1-9][0-9]*)|(0\.[0-9]+)|([1-9][0-9]*\.[0-9]+))) {yylval.val = atof(yytext); return NUMBER; }
%%
这是flex2.tab.h的内容,我注意到它在某个地方是sade 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;