C++ 野牛';s错误:请求成员‘;沙托克斯’;在非结构或联盟中

C++ 野牛';s错误:请求成员‘;沙托克斯’;在非结构或联盟中,c++,bison,flex-lexer,C++,Bison,Flex Lexer,我对bison/flex有这个问题(我看过其他帖子,但我没有在任何地方定义YYSTYPE,所以这不是问题所在)。我想使用%union将变量从lexer传递到.y。这就是我所拥有的 %{ #include "simple-expr.tab.h" #include <math.h> extern double vbltable[26]; extern int yyval; %} %% ([0-9]+|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) { yyval

我对bison/flex有这个问题(我看过其他帖子,但我没有在任何地方定义YYSTYPE,所以这不是问题所在)。我想使用%union将变量从lexer传递到.y。这就是我所拥有的

%{
#include "simple-expr.tab.h"
#include <math.h>
extern double vbltable[26];
extern int yyval;
%}

%%
([0-9]+|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) { yyval.integerID = atoi(yytext); return ID; }
\* { yyval.charTokens = yytext; return TIMES; }
\+ { yyval.charTokens = yytext; return PLUS; }
\( { yyval.charTokens = yytext; return LPAREN; }
\) { yyval.charTokens = yytext; return RPAREN; }
[ \t\n] ;
%%
%{
#包括“简单表达式选项卡h”
#包括
外部双vbltable[26];
外部-内部-yyval;
%}
%%
([0-9]+|([0-9]*\[0-9]+)([eE][-+]?[0-9]+)?){yyval.integerID=atoi(yytext);返回ID;}
\*{yyval.charTokens=yytext;返回时间;}
\+{yyval.charTokens=yytext;返回加号;}
\({yyval.charTokens=yytext;返回LPAREN;}
\){yyval.charTokens=yytext;返回RPAREN;}
[\t\n];
%%
及雅阁:

%{
%}

%union {
      int integerID;
      char* charTokens;
}

%token <charTokens> PLUS TIMES LPAREN RPAREN 
%token <integerID> ID

%%
e :  e PLUS t { printf("FROM THE yypars.y %c", PLUS); }
    | t
      ;
t : t TIMES f
    | f
      ;
f : LPAREN e RPAREN
    | ID
    ;

%%
%{
%}
%联合{
整数整数;
char*charTokens;
}
%令牌加时间LPAREN RPAREN
%令牌ID
%%
e:e加t{printf(“从yypars.y%c”,加上);}
|t
;
t:t乘以f
|f
;
f:LPAREN e RPAREN
|身份证
;
%%
以下是我遇到的错误:

简单表达式lex:9:8:错误:在非结构或联合中请求成员“integerID” 简单表达式lex:10:8:错误:请求非结构或联合中的成员“charTokens” 简单表达式lex:11:8:错误:请求非结构或联合中的成员“charTokens” 简单表达式lex:12:8:错误:请求非结构或联合中的成员“charTokens” 简单表达式lex:13:8:错误:请求非结构或联合中的成员“charTokens” make:[simple expr]错误1


正如我之前所说的-我没有在任何地方定义YYSTYPE,因此这应该不是问题。

将信息从lexer传递到解析器的变量的名称是
yylval
而不是
yyval
。它在
*.tab.h
中自动声明为正确的类型。所以这应该行得通

%{
#include "simple-expr.tab.h"
#include <math.h>
extern double vbltable[26];
%}

%%
([0-9]+|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) { yylval.integerID = atoi(yytext); return ID; }
\* { yylval.charTokens = yytext; return TIMES; }
\+ { yylval.charTokens = yytext; return PLUS; }
\( { yylval.charTokens = yytext; return LPAREN; }
\) { yylval.charTokens = yytext; return RPAREN; }
[ \t\n] ;
%%
%{
#包括“简单表达式选项卡h”
#包括
extern双vbltable[26];
%}
%%
([0-9]+|([0-9]*\[0-9]+)([eE][-+]?[0-9]+)?){yylval.integerID=atoi(yytext);返回ID;}
\*{yylval.charTokens=yytext;返回时间;}
\+{yylval.charTokens=yytext;返回加号;}
\({yylval.charTokens=yytext;返回LPAREN;}
\){yylval.charTokens=yytext;返回RPAREN;}
[\t\n];
%%

不能说我曾经使用过flex或bison,但我认为
yyval。integerID
在这里也是错误的,因为
yyval
是一个整数。它似乎符合接下来几行中出现的下一个错误字符串。非常感谢,这帮了大忙!但我还是不明白——我在看这本教科书(yacc和lex第二版),他们用的是yyval,而不是yylval。