;
primary_expr
- : identifier { $$ = newAst(EX_VALUE,symbolVal($1)); }
- | CONSTANT { $$ = newAst(EX_VALUE,$1); }
+ : identifier { $$ = newAst_VALUE(symbolVal($1)); }
+ | CONSTANT { $$ = newAst_VALUE($1); }
| string_literal
| '(' expr ')' { $$ = $2 ; }
;
string_literal
- : STRING_LITERAL { $$ = newAst(EX_VALUE,$1); }
+ : STRING_LITERAL { $$ = newAst_VALUE($1); }
;
postfix_expr
{
$3 = newSymbol($3->name,NestLevel);
$3->implicit = 1;
- $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst(EX_VALUE,symbolVal($3)));
+ $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($3)));
/* $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($3))) ; */
}
| postfix_expr PTR_OP identifier
{
$3 = newSymbol($3->name,NestLevel);
$3->implicit = 1;
- $$ = newNode(PTR_OP,$1,newAst(EX_VALUE,symbolVal($3)));
+ $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($3)));
}
| postfix_expr INC_OP
{ $$ = newNode(INC_OP,$1,NULL);}
| DEC_OP unary_expr { $$ = newNode(DEC_OP,NULL,$2); }
| unary_operator cast_expr { $$ = newNode($1,$2,NULL) ; }
| SIZEOF unary_expr { $$ = newNode(SIZEOF,NULL,$2); }
- | SIZEOF '(' type_name ')' { $$ = newAst(EX_VALUE,sizeofOp($3)); }
+ | SIZEOF '(' type_name ')' { $$ = newAst_VALUE(sizeofOp($3)); }
;
unary_operator
cast_expr
: unary_expr
- | '(' type_name ')' cast_expr { $$ = newNode(CAST,newAst(EX_LINK,$2),$4); }
+ | '(' type_name ')' cast_expr { $$ = newNode(CAST,newAst_LINK($2),$4); }
;
multiplicative_expr
jump_statement
: GOTO identifier ';' {
$2->islbl = 1;
- $$ = newAst(EX_VALUE,symbolVal($2));
+ $$ = newAst_VALUE(symbolVal($2));
$$ = newNode(GOTO,$$,NULL);
}
| CONTINUE ';' {
$$ = NULL;
}
else {
- $$ = newAst(EX_VALUE,symbolVal(STACK_PEEK(continueStack)));
+ $$ = newAst_VALUE(symbolVal(STACK_PEEK(continueStack)));
$$ = newNode(GOTO,$$,NULL);
/* mark the continue label as referenced */
STACK_PEEK(continueStack)->isref = 1;
werror(E_BREAK_CONTEXT);
$$ = NULL;
} else {
- $$ = newAst(EX_VALUE,symbolVal(STACK_PEEK(breakStack)));
+ $$ = newAst_VALUE(symbolVal(STACK_PEEK(breakStack)));
$$ = newNode(GOTO,$$,NULL);
STACK_PEEK(breakStack)->isref = 1;
}
/*-----------------------------------------------------------------*/
/* newAst - creates a fresh node for an expression tree */
/*-----------------------------------------------------------------*/
+#if 0
ast *newAst (int type, void *op )
{
ast *ex ;
return ex;
}
+#endif
+
+static ast* newAst_(unsigned type)
+{
+ ast *ex ;
+ static int oldLineno = 0 ;
+
+ ALLOC(ex,sizeof(ast));
+
+ ex->type = type ;
+ ex->lineno = (noLineno ? oldLineno : yylineno);
+ ex->filename = currFname ;
+ ex->level = NestLevel ;
+ ex->block = currBlockno ;
+ ex->initMode = inInitMode;
+ return ex;
+}
+
+ast* newAst_VALUE(value*val)
+{
+ ast* ex = newAst_(EX_VALUE);
+ ex->opval.val = val;
+ return ex;
+}
+
+ast* newAst_OP(unsigned op)
+{
+ ast*ex = newAst_(EX_OP);
+ ex->opval.op = op;
+ return ex;
+}
+
+ast* newAst_LINK(link*val)
+{
+ ast* ex = newAst_(EX_LINK);
+ ex->opval.lnk = val;
+ return ex;
+}
+
+ast* newAst_STMNT(unsigned val)
+{
+ ast* ex = newAst_(EX_STMNT);
+ ex->opval.stmnt = val;
+ return ex;
+}
/*-----------------------------------------------------------------*/
/* newNode - creates a new node */
{
ast *ex ;
- ex = newAst (EX_OP,(void *) op) ;
+ ex = newAst_OP(op) ;
ex->left = left ;
ex->right = right;
/* then depending on the expression value */
if ( floatFromVal(condAst->opval.val) )
- ifxNode = newNode(GOTO, newAst(EX_VALUE,
- symbolVal (trueLabel )),NULL);
+ ifxNode = newNode(GOTO,
+ newAst_VALUE(symbolVal(trueLabel)),
+ NULL);
else
- ifxNode = newNode(GOTO, newAst(EX_VALUE,
- symbolVal (falseLabel )),NULL);
+ ifxNode = newNode(GOTO,
+ newAst_VALUE(symbolVal(falseLabel)),
+ NULL);
}
else {
ifxNode = newNode(IFX,condAst,NULL);
/* now change the current one to a cast */
actParm->type = EX_OP ;
actParm->opval.op = CAST ;
- actParm->left = newAst(EX_LINK,defParm->type);
+ actParm->left = newAst_LINK(defParm->type);
actParm->right= pTree ;
actParm->etype= defParm->etype;
actParm->ftype= defParm->type;
if (!iloop)
break;
sflds->implicit = 1;
- lAst = newNode(PTR_OP,newNode('&',sym,NULL),newAst(EX_VALUE,symbolVal(sflds)));
+ lAst = newNode(PTR_OP,newNode('&',sym,NULL),newAst_VALUE(symbolVal(sflds)));
lAst = decorateType(resolveSymbols(lAst));
rast = decorateType(resolveSymbols(createIval (lAst, sflds->type, iloop,rast)));
}
ast *aSym ;
size++ ;
- aSym = newNode('[',sym,newAst(EX_VALUE,valueFromLit(size-1)));
+ aSym = newNode('[',sym,newAst_VALUE(valueFromLit(size-1)));
aSym = decorateType(resolveSymbols(aSym));
rast = createIval (aSym,type->next,iloop,rast) ;
iloop = (iloop ? iloop->next : NULL) ;
rast,
newNode('=',
newNode('[', sym,
- newAst(EX_VALUE,valueFromLit(i))),
- newAst(EX_VALUE,valueFromLit(*s))));
+ newAst_VALUE(valueFromLit(i))),
+ newAst_VALUE(valueFromLit(*s))));
i++;
s++;
}
rast,
newNode('=',
newNode('[', sym,
- newAst(EX_VALUE,valueFromLit(i))),
- newAst(EX_VALUE,valueFromLit(*s))));
+ newAst_VALUE(valueFromLit(i))),
+ newAst_VALUE(valueFromLit(*s))));
return decorateType(resolveSymbols(rast));
}
/*-----------------------------------------------------------------*/
ast *initAggregates ( symbol *sym, initList *ival, ast *wid)
{
- return createIval (newAst(EX_VALUE,symbolVal(sym)),sym->type,ival,wid);
+ return createIval (newAst_VALUE(symbolVal(sym)),sym->type,ival,wid);
}
/*-----------------------------------------------------------------*/
if (IS_AGGREGATE(sym->type))
work = initAggregates (sym, sym->ival,NULL);
else
- work = newNode('=' ,newAst(EX_VALUE,symbolVal(newSym)),
+ work = newNode('=' ,newAst_VALUE(symbolVal(newSym)),
list2expr(sym->ival));
setAstLineno(work,sym->lineDef);
if (IS_AGGREGATE(sym->type))
work = initAggregates (sym,sym->ival,NULL);
else
- work = newNode('=' ,newAst(EX_VALUE,symbolVal(sym)),
+ work = newNode('=' ,newAst_VALUE(symbolVal(sym)),
list2expr(sym->ival));
setAstLineno (work,sym->lineDef);
sym->block = sym->level = 0;
sym->isstrlit = 1;
/* create an ival */
- sym->ival = newiList(INIT_NODE,newAst(EX_VALUE,val));
+ sym->ival = newiList(INIT_NODE,newAst_VALUE(val));
if (noAlloc == 0) {
/* allocate it */
addSymChain(sym);
isSymbolEqual (*sym,AST_SYMBOL(condExpr->left->left))) {
*end = newNode('+', condExpr->left->right,
- newAst(EX_VALUE,constVal("1")));
+ newAst_VALUE(constVal("1")));
break;
}
return FALSE ;
body->type = EX_OP;
body->opval.op = '-';
- body->left = newAst(EX_VALUE,symbolVal(sym));
- body->right= newAst(EX_VALUE,constVal("1"));
+ body->left = newAst_VALUE(symbolVal(sym));
+ body->right= newAst_VALUE(constVal("1"));
}
/* put it together piece by piece */
rloop = newNode (NULLOP,
- createIf(newAst(EX_VALUE,symbolVal(sym)),
+ createIf(newAst_VALUE(symbolVal(sym)),
newNode(GOTO,
- newAst(EX_VALUE,
- symbolVal(AST_FOR(loop,continueLabel))),
+ newAst_VALUE(symbolVal(AST_FOR(loop,continueLabel))),
NULL),NULL),
newNode('=',
- newAst(EX_VALUE,symbolVal(sym)),
+ newAst_VALUE(symbolVal(sym)),
newNode('-', end,
- newAst(EX_VALUE,
- constVal("1")))));
+ newAst_VALUE(constVal("1")))));
replLoopSym(loop->left, sym);
rloop = newNode(NULLOP,
newNode('=',
- newAst(EX_VALUE,symbolVal(sym)),
+ newAst_VALUE(symbolVal(sym)),
newNode('-',end,init)),
createLabel(AST_FOR(loop,continueLabel),
newNode(NULLOP,
loop->left,
newNode(NULLOP,
newNode(SUB_ASSIGN,
- newAst(EX_VALUE,symbolVal(sym)),
- newAst(EX_VALUE,constVal("1"))),
+ newAst_VALUE(symbolVal(sym)),
+ newAst_VALUE(constVal("1"))),
rloop ))));
return decorateType(rloop);
if (checkType(currFunc->type->next,RTYPE(tree)) < 0 ) {
tree->right =
decorateType(newNode(CAST,
- newAst(EX_LINK,
- copyLinkChain(currFunc->type->next)),
+ newAst_LINK(copyLinkChain(currFunc->type->next)),
tree->right));
}
label->islbl = 1;
label->key = labelKey++ ;
- rValue = newNode (LABEL,newAst(EX_VALUE,symbolVal(label)),stmnt);
+ rValue = newNode (LABEL,newAst_VALUE(symbolVal(label)),stmnt);
rValue->lineno = 0;
return rValue ;
if ( elseBody ) {
ifBody = newNode(NULLOP,ifBody,
newNode(GOTO,
- newAst(EX_VALUE,symbolVal(ifEnd)),
+ newAst_VALUE(symbolVal(ifEnd)),
NULL));
/* put the elseLabel on the else body */
elseBody = createLabel (ifFalse,elseBody);
newNode(NULLOP,
loopExpr,
newNode(GOTO,
- newAst(EX_VALUE,symbolVal(condLabel)),
+ newAst_VALUE(symbolVal(condLabel)),
NULL)));
/* now start putting them together */
forTree = newNode(NULLOP,initExpr,condExpr);
whileBody = newNode(NULLOP,
whileBody,
newNode(GOTO,
- newAst(EX_VALUE,
- symbolVal(continueLabel)),
+ newAst_VALUE(symbolVal(continueLabel)),
createLabel(falseLabel,NULL)));
/* put it all together */
case '>' :
case '<' :
case NE_OP :
- optExpr = newAst(EX_VALUE,constVal("0"));
+ optExpr = newAst_VALUE(constVal("0"));
break;
case GE_OP :
case LE_OP :
case EQ_OP :
- optExpr = newAst(EX_VALUE,constVal("1"));
+ optExpr = newAst_VALUE(constVal("1"));
break;
}
case '<' : /* bit value < 1 means 0 */
case NE_OP :
- optExpr = newNode('!',newAst(EX_VALUE,vleft),NULL);
+ optExpr = newNode('!',newAst_VALUE(vleft),NULL);
break;
case LE_OP : /* bit value <= 1 means no check */
- optExpr = newAst(EX_VALUE,vright);
+ optExpr = newAst_VALUE(vright);
break;
case GE_OP : /* bit value >= 1 means only check for = */
case EQ_OP :
- optExpr = newAst(EX_VALUE,vleft);
+ optExpr = newAst_VALUE(vleft);
break;
}
} else { /* literal is zero */
case '>' : /* bit value > 0 means 1 */
case NE_OP :
- optExpr = newAst(EX_VALUE,vleft);
+ optExpr = newAst_VALUE(vleft);
break;
case LE_OP : /* bit value <= 0 means no check */
break;
case EQ_OP : /* bit == 0 means ! of bit */
- optExpr = newNode('!',newAst(EX_VALUE,vleft),NULL);
+ optExpr = newNode('!',newAst_VALUE(vleft),NULL);
break;
}
}
body = resolveSymbols(body); /* resolve the symbols */
body = decorateType (body); /* propagateType & do semantic checks */
- ex = newAst (EX_VALUE, symbolVal(name)); /* create name */
+ ex = newAst_VALUE(symbolVal(name)); /* create name */
ex = newNode (FUNCTION,ex,body);
ex->values.args = name->args ;