2013-11-30 2 views
0

Я делаю калькулятор с суммой и вычитания операцийсинтаксическая ошибка, неожиданный идентификатор, ожидающий тип. Yacc. зубр

это мой код ...

Calc.y  
%{ 
#include 
%} 

%union{ 
    double dval; 
} 

%token NUMERO 
%token SUMA RESTA 
%token ABRIR CERRAR 
%token END 
%left SUMA RESTA 
%left NEG 

%type Expresion 
%start Input 

%% 
Input: Line 
    | Input Line 
    ; 

Line: END 
    | Expresion END 
     { 
      printf("Resultado: %f\n",$1); 
     } 
    ; 

Expresion: NUMERO { $$=$1; } 
     | Expresion SUMA Expresion { $$=$1+$3; } 
     | Expresion RESTA Expresion { $$=$1-$3; } 
     | RESTA Expresion %prec NEG { $$=-$2; } 
     | ABRIR Expresion CERRAR { $$=$2; } 
     ; 
%% 

int yyerror(char *s) { printf("%s\n",s); } 
int main(void) { yyparse(); } 

И это ошибка calc.y: 16.7-15: ошибка синтаксиса, неожиданный идентификатор, ожидая типа

ответ

1

синтаксис %type директивы

%type <TAG> NONTERMINAL... 

, где TAG является одним из имен, указанных в вашей директиве %union. В вашем случае, есть только одно такое имя, поэтому я предполагаю, что вы имели в виду:

%type <dval> Expresion 

Вы также должны объявить, что NUMERO имеет тип <dval>; в противном случае, зубр будет жаловаться на эту продукцию:

Expresion: NUMERO { $$=$1; } 

потому что $1 имеет смысл только в случае, если объект, который он представляет, имеет значение, и как только вы объявляете %union, только терминалы и не-терминалы, которые имеют значения являются для которых вы предоставляете тип. Таким образом, вы действительно должны указать:

%token <dval> NUMERO 

Для получения дополнительной информации, смотрите в разделах 3.8.4, 3.8.2 и 3.8.5 в bison manual.

(Hay уна versión en español де ла руководство, нет вот он leído TODO Pero Creo дие ла парте Sobre declaraciones де Tipos де Valores эс adecuada: Лос Primeros capítulos ан Declaraciones de Bison excluyendo эль де precedencia.)

Смежные вопросы