bison的错误:请求成员'charTokens'的东西不是结构或联合

时间:2012-10-13 04:15:54

标签: c++ bison flex-lexer

我有这个问题与野牛/ flex(我见过其他帖子,但我没有在任何地方定义YYSTYPE,所以这不是问题)。我想使用%union将变量从词法分析器传递给.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] ;
%%

和yacc:

%{
%}

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

%%

这些是我得到的错误:

simple-expr.lex:9:8:错误:在某个结构或联合的东西中请求成员'integerID' simple-expr.lex:10:8:错误:请求成员'charTokens'不是结构或联合 simple-expr.lex:11:8:错误:请求成员'charTokens'不是结构或联合 simple-expr.lex:12:8:错误:请求成员'charTokens'不是结构或联合 simple-expr.lex:13:8:错误:请求成员'charTokens'不是结构或联合 make: * [simple-expr]错误1

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

1 个答案:

答案 0 :(得分:1)

将信息词从词法分析器传递到解析器的变量名称为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] ;
%%