%token BITWISEAND UNARYMINUS IPUSH IPOP PCALL ENDFUNCTION JUMPTABLE
%token RRC RLC
%token CAST CALL PARAM NULLOP BLOCK LABEL RECEIVE SEND ARRAYINIT
-%token DUMMY_READ_VOLATILE ENDCRITICAL
+%token DUMMY_READ_VOLATILE ENDCRITICAL SWAP
%type <yyint> Interrupt_storage
%type <sym> identifier declarator declarator2 enumerator_list enumerator
$$ = newNode($2,$1,$3);
break;
case MUL_ASSIGN:
- $$ = newNode('=',$1,newNode('*',removeIncDecOps(copyAst($1)),$3));
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode('*',removePreIncDecOps(copyAst($1)),$3));
break;
case DIV_ASSIGN:
- $$ = newNode('=',$1,newNode('/',removeIncDecOps(copyAst($1)),$3));
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode('/',removePreIncDecOps(copyAst($1)),$3));
break;
case MOD_ASSIGN:
- $$ = newNode('=',$1,newNode('%',removeIncDecOps(copyAst($1)),$3));
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode('%',removePreIncDecOps(copyAst($1)),$3));
break;
case ADD_ASSIGN:
- $$ = newNode('=',$1,newNode('+',removeIncDecOps(copyAst($1)),$3));
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode('+',removePreIncDecOps(copyAst($1)),$3));
break;
case SUB_ASSIGN:
- $$ = newNode('=',$1,newNode('-',removeIncDecOps(copyAst($1)),$3));
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode('-',removePreIncDecOps(copyAst($1)),$3));
break;
case LEFT_ASSIGN:
- $$ = newNode('=',$1,newNode(LEFT_OP,removeIncDecOps(copyAst($1)),$3));
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode(LEFT_OP,removePreIncDecOps(copyAst($1)),$3));
break;
case RIGHT_ASSIGN:
- $$ = newNode('=',$1,newNode(RIGHT_OP,removeIncDecOps(copyAst($1)),$3));
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode(RIGHT_OP,removePreIncDecOps(copyAst($1)),$3));
break;
case AND_ASSIGN:
- $$ = newNode('=',$1,newNode('&',removeIncDecOps(copyAst($1)),$3));
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode('&',removePreIncDecOps(copyAst($1)),$3));
break;
case XOR_ASSIGN:
- $$ = newNode('=',$1,newNode('^',removeIncDecOps(copyAst($1)),$3));
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode('^',removePreIncDecOps(copyAst($1)),$3));
break;
case OR_ASSIGN:
- $$ = newNode('=',$1,newNode('|',removeIncDecOps(copyAst($1)),$3));
+ /* $$ = newNode('=',$1,newNode('|',removeIncDecOps(copyAst($1)),$3)); */
+ $$ = newNode('=',removePostIncDecOps(copyAst($1)),
+ newNode('|',removePreIncDecOps(copyAst($1)),$3));
break;
default :
$$ = NULL;
sym_link *p ;
value *tval;
- p = (tval = constExprValue($3,TRUE))->etype;
+ tval = constExprValue($3,TRUE);
/* if it is not a constant then Error */
- if ( SPEC_SCLS(p) != S_LITERAL)
+ p = newLink (DECLARATOR);
+ DCL_TYPE(p) = ARRAY ;
+ if ( !tval || (SPEC_SCLS(tval->etype) != S_LITERAL)) {
werror(E_CONST_EXPECTED) ;
+ /* Assume a single item array to limit the cascade */
+ /* of additional errors. */
+ DCL_ELEM(p) = 1;
+ }
else {
- p = newLink (DECLARATOR);
- DCL_TYPE(p) = ARRAY ;
DCL_ELEM(p) = (int) floatFromVal(tval) ;
- addDecl($1,0,p);
}
+ addDecl($1,0,p);
}
| declarator2 '(' ')' { addDecl ($1,FUNCTION,NULL) ; }
| declarator2 '(' { NestLevel++ ; currBlockno++; } parameter_type_list ')'