X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2FSDCC.y;h=adf00af5e642856e55aa64e2b5e90b53d4e38d96;hb=94be96c2f91d5bbf593e73c4f55a5e4492bb0ebc;hp=42dd761bc380e383ea7114db71efaa467c707bf9;hpb=91b0931c40c5cad20cf18aa66303f9cb850f5dbc;p=fw%2Fsdcc diff --git a/src/SDCC.y b/src/SDCC.y index 42dd761b..adf00af5 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -74,7 +74,7 @@ value *cenum = NULL ; /* current enumeration type chain*/ %token IDENTIFIER TYPE_NAME %token CONSTANT STRING_LITERAL -%token SIZEOF +%token SIZEOF TYPEOF %token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP %token AND_OP OR_OP %token MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN @@ -85,7 +85,7 @@ value *cenum = NULL ; /* current enumeration type chain*/ %token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID BIT %token STRUCT UNION ENUM ELIPSIS RANGE FAR %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN -%token NAKED +%token NAKED JAVANATIVE OVERLAY %token INLINEASM %token IFX ADDRESS_OF GET_VALUE_AT_ADDRESS SPIL UNSPIL GETHBIT %token BITWISEAND UNARYMINUS IPUSH IPOP PCALL ENDFUNCTION JUMPTABLE @@ -179,7 +179,6 @@ function_attributes $$ = newLink() ; $$->class = SPECIFIER ; FUNC_REGBANK($$) = (int) floatFromVal($2); - //FUNC_RBANK($$) = 1; } | REENTRANT { $$ = newLink (); $$->class = SPECIFIER ; @@ -193,6 +192,14 @@ function_attributes $$->class = SPECIFIER ; FUNC_ISNAKED($$)=1; } + | JAVANATIVE { $$ = newLink (); + $$->class = SPECIFIER ; + FUNC_ISJAVANATIVE($$)=1; + } + | OVERLAY { $$ = newLink (); + $$->class = SPECIFIER ; + FUNC_ISOVERLAY($$)=1; + } | NONBANKED {$$ = newLink (); $$->class = SPECIFIER ; FUNC_NONBANKED($$) = 1; @@ -279,6 +286,7 @@ unary_expr | unary_operator cast_expr { $$ = newNode($1,$2,NULL) ; } | SIZEOF unary_expr { $$ = newNode(SIZEOF,NULL,$2); } | SIZEOF '(' type_name ')' { $$ = newAst_VALUE(sizeofOp($3)); } + | TYPEOF unary_expr { $$ = newNode(TYPEOF,NULL,$2); } ; unary_operator @@ -398,34 +406,34 @@ assignment_expr $$ = newNode($2,$1,$3); break; case MUL_ASSIGN: - $$ = newNode('=',$1,newNode('*',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('*',removeIncDecOps(copyAst($1)),$3)); break; case DIV_ASSIGN: - $$ = newNode('=',$1,newNode('/',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('/',removeIncDecOps(copyAst($1)),$3)); break; case MOD_ASSIGN: - $$ = newNode('=',$1,newNode('%',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('%',removeIncDecOps(copyAst($1)),$3)); break; case ADD_ASSIGN: - $$ = newNode('=',$1,newNode('+',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('+',removeIncDecOps(copyAst($1)),$3)); break; case SUB_ASSIGN: - $$ = newNode('=',$1,newNode('-',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('-',removeIncDecOps(copyAst($1)),$3)); break; case LEFT_ASSIGN: - $$ = newNode('=',$1,newNode(LEFT_OP,copyAst($1),$3)); + $$ = newNode('=',$1,newNode(LEFT_OP,removeIncDecOps(copyAst($1)),$3)); break; case RIGHT_ASSIGN: - $$ = newNode('=',$1,newNode(RIGHT_OP,copyAst($1),$3)); + $$ = newNode('=',$1,newNode(RIGHT_OP,removeIncDecOps(copyAst($1)),$3)); break; case AND_ASSIGN: - $$ = newNode('=',$1,newNode('&',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('&',removeIncDecOps(copyAst($1)),$3)); break; case XOR_ASSIGN: - $$ = newNode('=',$1,newNode('^',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('^',removeIncDecOps(copyAst($1)),$3)); break; case OR_ASSIGN: - $$ = newNode('=',$1,newNode('|',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('|',removeIncDecOps(copyAst($1)),$3)); break; default : $$ = NULL; @@ -791,8 +799,8 @@ struct_declarator enum_specifier : ENUM '{' enumerator_list '}' { - addSymChain ($3); - allocVariables(reverseSyms($3)) ; + //addSymChain ($3); + //allocVariables(reverseSyms($3)) ; $$ = copyLinkChain(cenum->type); } | ENUM identifier '{' enumerator_list '}' { @@ -806,8 +814,8 @@ enum_specifier werror(E_DUPLICATE_TYPEDEF,csym->name); addSym ( enumTab,$2,$2->name,$2->level,$2->block, 0); - addSymChain ($4); - allocVariables (reverseSyms($4)); + //addSymChain ($4); + //allocVariables (reverseSyms($4)); $$ = copyLinkChain(cenum->type); SPEC_SCLS(getSpec($$)) = 0 ; } @@ -838,15 +846,17 @@ enumerator_list ; enumerator - : identifier opt_assign_expr { - /* make the symbol one level up */ - $1->level-- ; - $1->type = copyLinkChain($2->type); - $1->etype= getSpec($1->type); - SPEC_ENUM($1->etype) = 1; - $$ = $1 ; - - } + : identifier opt_assign_expr + { + /* make the symbol one level up */ + $1->level-- ; + $1->type = copyLinkChain($2->type); + $1->etype= getSpec($1->type); + SPEC_ENUM($1->etype) = 1; + $$ = $1 ; + // do this now, so we can use it for the next enums in the list + addSymChain($1); + } ; opt_assign_expr @@ -880,7 +890,7 @@ declarator declarator2_function_attributes : declarator2 { $$ = $1 ; } | declarator2 function_attribute { - // do the functionAttributes (not the args and hasVargs !!) + // copy the functionAttributes (not the args and hasVargs !!) sym_link *funcType=$1->etype; struct value *args=FUNC_ARGS(funcType); unsigned hasVargs=FUNC_HASVARARGS(funcType); @@ -974,7 +984,7 @@ pointer { $$ = $1 ; $$->next = $2 ; - DCL_TYPE($2)=GPOINTER; + DCL_TYPE($2)=port->unqualified_pointer; } | unqualified_pointer type_specifier_list pointer { @@ -1003,7 +1013,9 @@ pointer DCL_TYPE($3) = EEPPOINTER; break; default: - werror(W_PTR_TYPE_INVALID); + // this could be just "constant" + // werror(W_PTR_TYPE_INVALID); + ; } } else @@ -1135,6 +1147,12 @@ abstract_declarator2 // $1 must be a pointer to a function sym_link *p=newLink(); DCL_TYPE(p) = FUNCTION; + if (!$1) { + // ((void (code *) ()) 0) () + $1=newLink(); + DCL_TYPE($1)=CPOINTER; + $$ = $1; + } $1->next=p; } | abstract_declarator2 '(' parameter_type_list ')' { @@ -1145,9 +1163,16 @@ abstract_declarator2 // $1 must be a pointer to a function sym_link *p=newLink(); DCL_TYPE(p) = FUNCTION; + if (!$1) { + // ((void (code *) (void)) 0) () + $1=newLink(); + DCL_TYPE($1)=CPOINTER; + $$ = $1; + } $1->next=p; } } + ; initializer : assignment_expr { $$ = newiList(INIT_NODE,$1); } @@ -1289,6 +1314,7 @@ while : WHILE { /* create and push the continue , break & body labels */ sprintf (lbuff,"_whilebody_%d",Lblnum++); $$ = newSymbol(lbuff,NestLevel); } + ; do : DO { /* create and push the continue , break & body Labels */ static int Lblnum = 0 ; @@ -1303,6 +1329,8 @@ do : DO { /* create and push the continue , break & body Labels */ sprintf (lbuff,"_dobody_%d",Lblnum++); $$ = newSymbol (lbuff,NestLevel); } + ; + for : FOR { /* create & push continue, break & body labels */ static int Lblnum = 0 ; @@ -1319,6 +1347,7 @@ for : FOR { /* create & push continue, break & body labels */ sprintf (lbuff,"_forcond_%d",Lblnum++); STACK_PUSH(forStack,newSymbol(lbuff,NestLevel)); } + ; iteration_statement : while '(' expr ')' statement