我正在使用求和和减法运算
这是我的代码......
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:语法错误,意外标识符,期望类型
答案 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>