X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2FSDCC.y;h=53cd3b5a02f1d23de06fec5547685b12296ad6c6;hb=c4b55ee40ddb79b816c42b1567dc9b5858153b66;hp=ec90153ab7dc95add11b0ede8af3a2dbda2afea9;hpb=9bb476c67d50719d1fa11ba936211eadffad3efd;p=fw%2Fsdcc diff --git a/src/SDCC.y b/src/SDCC.y index ec90153a..53cd3b5a 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -58,6 +58,8 @@ STACK_DCL(blockNum,int,MAX_NEST_LEVEL*3) value *cenum = NULL ; /* current enumeration type chain*/ %} +%expect 6 + %union { symbol *sym ; /* symbol table pointer */ structdef *sdef; /* structure definition */ @@ -88,7 +90,7 @@ value *cenum = NULL ; /* current enumeration type chain*/ %token IFX ADDRESS_OF GET_VALUE_AT_ADDRESS SPIL UNSPIL GETHBIT %token BITWISEAND UNARYMINUS IPUSH IPOP PCALL ENDFUNCTION JUMPTABLE %token RRC RLC -%token CAST CALL PARAM NULLOP BLOCK LABEL RECEIVE SEND +%token CAST CALL PARAM NULLOP BLOCK LABEL RECEIVE SEND ARRAYINIT %type Interrupt_storage %type identifier declarator declarator2 enumerator_list enumerator @@ -167,7 +169,7 @@ function_definition using_reentrant : using_reentrant_interrupt - | using_reentrant_interrupt using_reentrant { $$ = mergeSpec($1,$2); } + | using_reentrant_interrupt using_reentrant { $$ = mergeSpec($1,$2,"using_reentrant"); } ; using_reentrant_interrupt @@ -480,11 +482,11 @@ declaration_specifiers sym_link *lnk = $2 ; while (lnk && !IS_SPEC(lnk->next)) lnk = lnk->next; - lnk->next = mergeSpec($1,lnk->next); + lnk->next = mergeSpec($1,lnk->next, yytext); $$ = $2 ; } else - $$ = mergeSpec($1,$2); + $$ = mergeSpec($1,$2, yytext); } | type_specifier { $$ = $1; } | type_specifier declaration_specifiers { @@ -494,11 +496,11 @@ declaration_specifiers sym_link *lnk = $2 ; while (lnk && !IS_SPEC(lnk->next)) lnk = lnk->next; - lnk->next = mergeSpec($1,lnk->next); + lnk->next = mergeSpec($1,lnk->next, yytext); $$ = $2 ; } else - $$ = mergeSpec($1,$2); + $$ = mergeSpec($1,$2, yytext); } ; @@ -565,8 +567,7 @@ type_specifier2 | SHORT { $$=newLink(); $$->class = SPECIFIER ; - SPEC_NOUN($$) = V_INT ; - SPEC_SHORT($$) = 1 ; + $$->select.s._short = 1 ; } | INT { $$=newLink(); @@ -576,19 +577,16 @@ type_specifier2 | LONG { $$=newLink(); $$->class = SPECIFIER ; - SPEC_NOUN($$) = V_INT ; SPEC_LONG($$) = 1 ; } | SIGNED { $$=newLink(); $$->class = SPECIFIER ; - SPEC_NOUN($$) = V_INT ; - SPEC_SIGNED($$) = 1 ; + $$->select.s._signed = 1; } | UNSIGNED { $$=newLink(); $$->class = SPECIFIER ; - SPEC_NOUN($$) = V_INT ; SPEC_USIGN($$) = 1 ; } | VOID { @@ -599,7 +597,6 @@ type_specifier2 | CONST { $$=newLink(); $$->class = SPECIFIER ; - SPEC_SCLS($$) = S_CONSTANT ; SPEC_CONST($$) = 1; } | VOLATILE { @@ -660,7 +657,6 @@ type_specifier2 { symbol *sym; sym_link *p ; - sym = findSym(TypedefTab,NULL,$1) ; $$ = p = copyLinkChain(sym->type); SPEC_TYPEDEF(getSpec(p)) = 0; @@ -715,24 +711,23 @@ struct_or_union ; opt_stag - : stag - | { /* synthesize a name add to structtable */ - $$ = newStruct(genSymName(NestLevel)) ; - $$->level = NestLevel ; - addSym (StructTab, $$, $$->tag,$$->level,currBlockno) ; - } - ; +: stag +| { /* synthesize a name add to structtable */ + $$ = newStruct(genSymName(NestLevel)) ; + $$->level = NestLevel ; + addSym (StructTab, $$, $$->tag,$$->level,currBlockno, 0); +}; stag - : identifier { /* add name to structure table */ - $$ = findSymWithBlock (StructTab,$1,currBlockno); - if (! $$ ) { - $$ = newStruct($1->name) ; - $$->level = NestLevel ; - addSym (StructTab, $$, $$->tag,$$->level,currBlockno) ; - } - } - ; +: identifier { /* add name to structure table */ + $$ = findSymWithBlock (StructTab,$1,currBlockno); + if (! $$ ) { + $$ = newStruct($1->name) ; + $$->level = NestLevel ; + addSym (StructTab, $$, $$->tag,$$->level,currBlockno,0); + } +}; + struct_declaration_list : struct_declaration @@ -754,14 +749,18 @@ struct_declaration symbol *sym ; for ( sym = $2 ; sym != NULL ; sym = sym->next ) { + /* make the symbol one level up */ + sym->level-- ; + pointerTypes(sym->type,copyLinkChain($1)); if (!sym->type) { sym->type = copyLinkChain($1); sym->etype = getSpec(sym->type); + /* make sure the type is complete and sane */ + checkTypeSanity(sym->etype, sym->name); } else addDecl (sym,0,cloneSpec($1)); - } $$ = $2; } @@ -804,7 +803,7 @@ enum_specifier (csym && csym->level == $2->level)) werror(E_DUPLICATE_TYPEDEF,csym->name); - addSym ( enumTab,$2,$2->name,$2->level,$2->block); + addSym ( enumTab,$2,$2->name,$2->level,$2->block, 0); addSymChain ($4); allocVariables (reverseSyms($4)); $$ = copyLinkChain(cenum->type); @@ -828,6 +827,8 @@ enum_specifier enumerator_list : enumerator + | enumerator_list ',' { + } | enumerator_list ',' enumerator { $3->next = $1 ; $$ = $3 ; @@ -1002,7 +1003,7 @@ far_near type_specifier_list : type_specifier - | type_specifier_list type_specifier { $$ = mergeSpec ($1,$2); } + | type_specifier_list type_specifier { $$ = mergeSpec ($1,$2, "type_specifier_list"); } ; parameter_identifier_list