语法错误,意外标识符,期望类型。 YACC。野牛

时间:2013-11-30 03:11:49

标签: bison 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 个答案:

答案 0 :(得分:1)

%type指令的语法是

%type <TAG> NONTERMINAL...

其中TAG%union指令中声明的名称之一。在你的情况下,只有一个这样的名字,所以我认为你的意思是:

%type <dval> Expresion

您还必须声明NUMERO的类型为<dval>;否则,野牛会抱怨这种生产:

Expresion:  NUMERO { $$=$1; }

因为$1仅在其所代表的对象具有值时才有意义,并且一旦声明%union,则唯一具有值的终端和非终端是您提供的对象一种。所以你应该指定:

%token <dval> NUMERO

有关详细信息,请参阅bison manual中的3.8.4,3.8.2和3.8.5节。

(Hay una versión en español de la manual; no lo he leido leod todo pero creo que la parte sobre declaraciones de tipos de valores es adecuada:losprimeroscapítulosenDeclaraciones de Bison excluyendo el de precedencia。)< / p>

相关问题