scanner - 解析器错误:yylval undefined

时间:2014-02-19 22:56:55

标签: c parsing visual-studio-2008 unions lexical-analysis

我正在尝试构建一个扫描程序解析器来处理像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;

0 个答案:

没有答案