static int analyze_opttag(NODE * opt_tag_tag, enum nonterminal_enum tp){ if(opt_tag_tag->child_head == NULL){//anonymous struct NODE* temp = opt_tag_tag->parent->parent->next_sister ;//head->child_head->next_sister;// const char * ctemp = temp->name ; if(tp == ExtDef && ctemp == terminal_name[SEMI-WHILE] ){ #ifndef SUBMIT warning("unnamed struct that defines no instances", temp->parent->line); #endif }else if(tp == ExtDef && ctemp == nonterminal_name[ExtDecList] ){ pass_attr_null_opttag(temp,create_type_kind(STRUCTURE_TYPE,NULL,NULL)); }else if(tp == ExtDef && ctemp == nonterminal_name[FunDec]){ NODE* ttemp = temp->parent->child_head->next_sister->child_head ;//fun id pass_attr_null_opttag(temp,create_type_kind(STRUCTURE_TYPE,NULL,NULL)); }else if(tp == Def && ctemp == nonterminal_name[DecList]){ pass_attr_null_opttag(temp,create_type_kind(STRUCTURE_TYPE,NULL,NULL)); }else if(tp == ParamDec && temp->name == nonterminal_name[VarDec]){ pass_attr_null_opttag(temp,create_type_kind(STRUCTURE_TYPE,NULL,NULL)); }else{ perror("unknown error : anonymous struct"); exit(EXIT_FAILURE); } }else if(opt_tag_tag->child_head->name == terminal_name[ID-WHILE]){ NODE* temp = opt_tag_tag->parent->parent->next_sister ;//head->child_head->next_sister;// const char * ctemp = temp->name ; IDTEM * tid = opt_tag_tag->child_head->value.type_p ; tid = tid->cur ; if(tp == ExtDef && ctemp == terminal_name[SEMI-WHILE] ){ pass_attr_id_opttag(temp,create_type_kind(STRUCTURE_TYPE,NULL,tid->name)); addstruct(temp->parent->child_head->child_head->child_head->next_sister->child_head); }else if(tp == ExtDef && ctemp == nonterminal_name[ExtDecList] ){ pass_attr_id_opttag(temp,create_type_kind(STRUCTURE_TYPE,NULL,tid->name)); addstruct(temp->parent->child_head->child_head->child_head->next_sister->child_head); }else if(tp == ExtDef && ctemp == nonterminal_name[FunDec]){ NODE* ttemp = temp->parent->child_head->next_sister->child_head ;//fun id pass_attr_id_opttag(temp,create_type_kind(STRUCTURE_TYPE,NULL,tid->name)); addstruct(temp->parent->child_head->child_head->child_head->next_sister->child_head); }else if(tp == Def && ctemp == nonterminal_name[DecList]){ pass_attr_id_opttag(temp,create_type_kind(STRUCTURE_TYPE,NULL,tid->name)); /*ignore ID*/ }else if(tp == ParamDec && temp->name == nonterminal_name[VarDec]){ pass_attr_id_opttag(temp,create_type_kind(STRUCTURE_TYPE,NULL,tid->name)); }else{ perror("unknown error : anonymous struct"); exit(EXIT_FAILURE); } }else{ perror("unknown error :3"); exit(EXIT_FAILURE); } return 0; }
static Dtree *addpat(Dtree *t, Node *pat, Node *val, Node ***cap, size_t *ncap) { Dtree *ret; Node *dcl; if (pat == NULL) return t; pat = fold(pat, 1); switch (exprop(pat)) { case Ovar: dcl = decls[pat->expr.did]; if (dcl->decl.isconst) ret = addpat(t, dcl->decl.init, val, cap, ncap); else ret = addwild(t, pat, val, cap, ncap); break; case Oucon: ret = addunion(t, pat, val, cap, ncap); break; case Olit: ret = addlit(t, pat, val, cap, ncap); break; case Otup: ret = addtup(t, pat, val, cap, ncap); break; case Oarr: ret = addarr(t, pat, val, cap, ncap); break; case Ostruct: ret = addstruct(t, pat, val, cap, ncap); break; case Ogap: ret = addwild(t, pat, val, NULL, NULL); break; default: ret = NULL; fatal(pat, "unsupported pattern %s of type %s", opstr[exprop(pat)], tystr(exprtype(pat))); break; } return ret; }