Bison 请求成员“”;不是在某种结构或联盟中?在Flex&;野牛

Bison 请求成员“”;不是在某种结构或联盟中?在Flex&;野牛,bison,flex-lexer,Bison,Flex Lexer,在我的最后一个项目中,我留下了几个代码,其中一个是flex&bison的代码。问题是gcc会将消息返回给我 “错误:请求非结构或联合中的成员'n' 141 | |康斯坦特{$=narynew(“康斯坦特”)}” 在野牛档案中。。。我不知道如何解决这个问题 %{ #包括 #包括 #包括 #包括“parserMiniC.tab.h” int yylex(无效); 无效错误(字符*); 类型定义结构节点{ 字符*类型; 结构节点**子节点; 智力儿童; }节点t; typedef struct_l

在我的最后一个项目中,我留下了几个代码,其中一个是flex&bison的代码。问题是gcc会将消息返回给我

“错误:请求非结构或联合中的成员'n'
141 | |康斯坦特{$=narynew(“康斯坦特”)}”
在野牛档案中。。。我不知道如何解决这个问题


%{
#包括
#包括
#包括
#包括“parserMiniC.tab.h”
int yylex(无效);
无效错误(字符*);
类型定义结构节点{
字符*类型;
结构节点**子节点;
智力儿童;
}节点t;
typedef struct_liste_t{node_t*node;struct_liste_t*suivant;}liste_t;
liste_t*creer_liste(node_t*p);
liste_t*concatener_listes(liste_t*l1,liste_t*l2);
node_t*attacher_liste(liste_t*liste,node_t*p);
node_t*narynew(char*nom);
node_t*naryattach(node_t*par,node_t*child);
void*naryprint(节点*par);
bool error\u syntaxical=false;
外部无符号整数行号;
外部布尔错误;
%}
%联合{
节点_t*n;
}
%左加莫因
%左多功能分区
%左L档重新换档
%左波尔带
%左岸
%那就不需要了
%非ASSOC ELSE
%左OP
%左相对
%类型表达式函数变量
%类型指令列表\u指令参数列表\u参数
%象征君士坦丁
%WHILE IF ELSE的令牌identicateur VOID INT开关情况默认值
%令牌中断返回加上MOIN MUL DIV LSHIFT RSHIFT BAND BOR LAND LOR LT GT
%令牌GEQ LEQ EQ NEQ非外部
%启动程序
%%
方案:
列表声明列表功能
;
列表声明:
列表声明
|   
;
列表功能:
李斯特汤
|功能
;
宣言:
键入liste_declarateurs';'
;
列出声明人:
列出“声明人”、“声明人”
|报关员
;
声明人:
识别器
|声明人'['君士坦丁']'
;
作用:
类型标识符'('liste_parms')'{'liste_声明liste_指令'}'
|外部类型标识符'('liste_parms')'”;'
;
类型:
无效的
|INT
;
李斯特·帕姆斯:
李斯特·帕尔姆
|帕尔姆
;
帕尔姆:
内标识
;
列出说明:
列表说明
|指示
;
说明:
迭代
|挑选
|炒
|矫揉造作
|集团
|阿佩尔
;
迭代:
对于“(‘矫揉造作’;‘条件’;‘矫揉造作’)”指令
|而“(“条件”)”指令
;
选择:
如果“(“条件”)”指令%prec,则
|IF'('condition')指令ELSE指令
|开关“(“表达式”)”指令
|CASE CONSTANTE':'指令
|默认“:”指令
;
炒:
打破“;”
|返回“;”
|返回表达式“;”
;
做作:
变量“=”表达式
;
集团:
“{liste_声明liste_指令”}”
;
上诉:
IDENTIFICATEUR'('liste_expressions')”;'
;
变量:
识别器
|变量“[”表达式“]”
;
表达方式:
“(“表达式”)”
|表达式二进制运算表达式%prec op
|莫因表达
|康斯坦特{$$=narynew(“康斯坦特”);}
|变量{$$=narynew(“变量”);}
|IDENTIFICATEUR'('liste_expressions')'
;
列表表达式:
liste_表达式“,”表达式
|表情
|
;
条件:
不是“(“条件”)”
|条件二进制_rel条件%prec rel
|“(“条件”)”
|表达式二进制_comp表达式
;
二进制运算:
加上
|莫因
|骡子
|DIV
|升档
|换档
|乐队
|博尔
;
二进制关系:
土地
|洛尔
;
二进制编码:
书信电报
|燃气轮机
|GEQ
|莱克
|情商
|NEQ
;
%%
内部主(空){
printf(“分析综合征首次亮相:\n”);
yyparse();
printf(“Fin de l'analysis!\n”);
printf(“结果:\n”);
naryprint(根);
返回退出成功;
}
无效错误(字符*s){
fprintf(标准,“对齐%d的语法错误:%s\n”,行号,s);
}
//树胶。。。
void*naryprint(节点*par)
{
大小_tcldidx;
节点*cld;
节点匹配;
匹配=空;
对于(cldidx=0;cldidxchildren;++cldidx){
cld=par->child[cldidx];
如果(cld==NULL)
继续;
printf(“%s-->%s\n”,par->type,cld->type);
}
对于(cldidx=0;cldidxchildren;++cldidx){
cld=par->child[cldidx];
如果(cld==NULL)
继续;
naryprint(cld);
}
}
//narynew——获取新节点
node_t*narynew(char*nom)
{
node_t*node;
node=calloc(1,sizeof(node_t));
节点->子节点=0;
节点->类型=名称;
返回节点;
}
//naryattach--附加新的子节点
node_t*naryattach(node_t*par,node_t*child)
{
大小_tcldidx;
节点*cld;
//增加数组的大小
cldidx=par->children++;
par->child=realloc(par->child,sizeof(node_t*)*par->children);
//分配新节点
cld=儿童;
//交叉链接父项和子项
par->child[cldidx]=cld;
printf(“%s est attaché\n”,cld->type);
返回票面金额;
}
liste_t*creer_liste(node_t*p){
李斯特;
liste=(liste_t*)malloc(sizeof(liste_t));
liste->node=p;
liste->suivant=NULL;
返回列表;}
列表*concatener\u列表(列表*l1,列表*l2){
liste_t*l=l1;
if(l1==NULL)
返回l2;
while(l->suivant!=NULL)
l=l->suivant;
l->suivant=l2;
返回l1;
}
node_t*attacher_liste(liste_t*liste,node_t*p){
李斯特;
节点_t*n;
对于(l=liste;l!=NULL;l=l->suivant){
n=l->node;
naryattach(p,n);
}
返回p;
}