コード例 #1
0
ファイル: analyze.c プロジェクト: fanchylee/Calc_bison_flex
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;
}
コード例 #2
0
ファイル: match.c プロジェクト: 8l/myrddin
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;
}