Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 扫描程序-分析器错误:yylval未定义_C_Parsing_Visual Studio 2008_Unions_Lexical Analysis - Fatal编程技术网

C 扫描程序-分析器错误:yylval未定义

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。如果有人能指出

我正在尝试构建一个扫描分析器来处理像这样的输入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代码:

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