Lex и Yacc деклирированный тип, СИНТАКСИЧЕСКАЯ ОШИБКА

#token #union #flex-lexer #yacc #lex

#знак #союз #флекс-лексер #yacc #лекс

Вопрос:

в коде .y:

 %union{  int ival;  int *ivals;  char id[20];  char *str;  bool *b; } %start START  %token COMMENT OP_PLUS OP_MINUS OP_DIV OP_MULT OP_OP OP_CP OP_DBLMULT OP_OC OP_CC OP_COMMA KW_AND KW_OR KW_NOT KW_EQUAL KW_LESS KW_NIL KW_LIST KW_APPEND KW_CONCAT KW_SET KW_DEFFUN KW_FOR KW_IF KW_EXIT KW_DEFVAR KW_WHILE KW_LOAD KW_DISP KW_TRUE KW_FALSE NEWLINE FLOAT_NUMBER LISTOP   %token lt;ivalgt; LIMITED_VALUE %token lt;idgt; IDENTIFIER %token lt;strgt; FLE %token lt;ivalgt; NUMBER  %type lt;ivalgt; START %type lt;ivalgt; EXPI %type lt;ivalgt; EXPB %type lt;ivalsgt; VALUES %type lt;ivalsgt; EXPLISTI %type lt;ivalsgt; LISTVALUE %type lt;bgt; BinaryValue  

в коде l:

 [[:alpha:]][[:alnum:]]* {strcpy(yylval.id, yytext); return IDENTIFIER;} [[1-9][:digit:]]  {yylval.ival = atoi(yytext); return VALUE;} {LIMITED_VALUE} {yylval.ival = atoi(yytext); return VALUE;}  

Я получил ошибку:

ошибка: $3 «EXPI» не имеет объявленного типа $$=$3;

код блога со строкой, в которой я получил ошибку:

 | OP_OP KW_WHILE OP_OP EXPB OP_CP EXPLISTI OP_CP{   $=$3;   if(!$3){  listIndex=0;  listValues[0]=NULL;  }  list_flag=1; }  

Почему я получаю ошибку, когда объявляю ее? Можете ли вы помочь мне решить эту проблему?

—-Обновление—

Я решил эту проблему с помощью ответа @sepp2k, но теперь я получаю другую ошибку.

 START:| INPUT{  if(!flag amp;amp; list_flag){  printf("Syntax OK.n");  printf("Result:");     printList(listValues,listIndex);   listIndex=0;    holdIndex=0;  list_flag=0;  }  else if(!flag amp;amp; binary_flag){  printf("Syntax OK.n");  if($==1)  printf("Result:Tn");  else  printf("Result:NILn");  binary_flag=0;  }  else if(!flag){  printf("Syntax OK.n");  printf("Result:%d",$);   }  return 0;  };  INPUT: EXPI | EXPLISTI | EXPB{ binary_flag=1; } ;  EXPI: OP_OP KW_DEFVAR IDENTIFIER EXPI OP_CP { $=$4; }  | OP_OP KW_SET IDENTIFIER EXPI OP_CP { $=$4; }  | OP_OP OP_PLUS EXPI EXPI OP_CP { $=$3 $4; }  | OP_OP OP_MINUS EXPI EXPI OP_CP { $=$3-$4; }  | OP_OP OP_MULT EXPI EXPI OP_CP { $=$3*$4; }  | OP_OP OP_DBLMULT EXPI EXPI OP_CP { $=pow($3,$4); }  | OP_OP OP_DIV EXPI EXPI OP_CP { $=$3/$4; }   

Это в моем коде .y. Если я написал (* 5 2) в consol, я получаю ошибку, которая заключается в том, что выражение SYNTAX_ERROR не распознано. Я определил этот синтаксис, почему я получаю такую ошибку?

Комментарии:

1. $3 есть OP_OP , у которого нет типа. EXPB является $4 .

2. @sepp2k спасибо за ответ, это работает, но теперь я получаю ошибку в чем-то другом

3. @sepp2k Я обновил вопрос об ошибке, которую я получил, я был бы очень рад, если бы вы посмотрели еще раз

4. Общая отладка синтаксического анализатора-используйте -d опцию bison и введите yydebug = 1; ее непосредственно перед вызовом yyparse() . Для вашего кода, похоже, у вас нет ничего, что могло бы распознать простую межблочную константу как EXPI

5. Я использую опцию-d @ChrisDodd , перед добавлением union (* 5 2) не выдал никакой ошибки. Я не понимаю, что вы сказали