ошибка бизона: запрос на членство в charTokens не в структуре или объединении

У меня есть эта проблема с bison / flex (я видел другие посты, но я нигде не определяю YYSTYPE, так что это не проблема здесь). Я хочу передать переменные из лексера в .y, используя% union. Это то, что у меня есть

%{
#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’ в чем-то, не являющемся структурой или объединением
делать: * [simple-expr] Ошибка 1

Как я уже говорил, я нигде не определяю YYSTYPE, так что проблем не должно быть.

0

Решение

Имя переменной для передачи информации из лексера в парсер 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] ;
%%
1

Другие решения

Других решений пока нет …