我想在Yacc中编码moy的计算,所以我做了这段代码
%{
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
// Fonction qui permet de claculer la moyenne
double moy(int*ls,int size )
{
int som=0;
for(int j=0; j<size;j++)
som+=ls[j];
return (som/size);
}
/* La structure de la table*/
%}
%union {
int value;
struct s{int *ls; int size;} str;
}
%token nb
%type <value> E
%type <str> L
%left '+','-'
%left '*','/'
//%right '^'
//%right moins_unaire
%%
Ligne : E '\n' {printf("%d \n",$1);}
;
E : E '-' T {$$=$1-$3;}
| E '+' T {$$=$1+$3;}
| T {$$=$1;}
;
T : T '*' F
| T '/' F
| F
;
F : '(' E ')' {$$=$2;}
| nb {$$=$1;}
| fct {$$=$1;}
;
fct: nf '('L ')' {if ($1==1) {
$$= moy($3.ls,$3.size);
}
;
nf : 'moy' {$$=1;}
;
L : L ',' E {$$.ls=$1; $$.ls[$$.size++]=$3;}
| E {$$.size=1; $$.ls=malloc(50); $$.ls[0]=$1;}
;
%%
main ()
{
yyparse();
}
但是一旦我编译它我就得到了那些警告:
...编译 mo.y
C:\Users\LE\Desktop\exos\moy\mo.y(35) : warning Y4003: '$3' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(36) : warning Y4003: '$3' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(37) : warning Y4003: '$1' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(43) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(44) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(44) : warning Y4003: '$1' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(45) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(45) : warning Y4003: '$1' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(47) : warning Y4003: '$1' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(48) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(51) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(53) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(53) : warning Y4003: '$1' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(53) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(53) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(54) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(54) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(54) : warning Y4003: '$$' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(54) : warning Y4003: '$1' : attribute is untyped
C:\Users\LE\Desktop\exos\moy\mo.y(62) : fatal error Y1015: unexpected end of file found in action
g - 1 error(s), 19 warning(s)
我注意到,一旦删除这两行:
%type <value> E
%type <str> L
无类型错误消失。我搜索了很多,但我无法解决问题。
我该怎么办?
答案 0 :(得分:4)
你需要
%type <value> E T F
修复类型错误。
如@JeffMercado所述,过早的EOF是由多余的第一支撑造成的
fct: nf '('L ')' {if ($1==1) {
和
%left '+','-'
%left '*','/'
这是不对的。逗号应该是空格。