#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) не выдал никакой ошибки. Я не понимаю, что вы сказали