allocate AST node only when needed
This commit is contained in:
parent
8cd31829ad
commit
91375ea572
1 changed files with 4 additions and 6 deletions
|
@ -422,29 +422,28 @@ while_stmt(ParserState *ps)
|
|||
static Ast *
|
||||
atom(ParserState *ps)
|
||||
{
|
||||
Ast *tree = make_tree(AST_INVALID, ps->lexer->cur_loc);
|
||||
Ast *tree = nil;
|
||||
LexToken t = lex_scan(ps->lexer);
|
||||
LexToken next;
|
||||
|
||||
switch (t.id) {
|
||||
case T_NUMBER:
|
||||
tree->type = AST_NUMBER;
|
||||
tree = make_tree(AST_NUMBER, ps->lexer->cur_loc);
|
||||
tree->number.n = t.inumber;
|
||||
trace("number in atom: %lu\n", t.inumber);
|
||||
return tree;
|
||||
case T_STRING:
|
||||
tree->type = AST_STRLIT;
|
||||
tree = make_tree(AST_STRLIT, ps->lexer->cur_loc);
|
||||
tree->strlit = t.str;
|
||||
return tree;
|
||||
case T_IDENT:
|
||||
next = lex_scan(ps->lexer);
|
||||
/* It is a plain symbol or a function call? */
|
||||
if (next.id == T_LPAREN) {
|
||||
free(tree);
|
||||
tree = function_call(ps, t.ident, true);
|
||||
} else {
|
||||
lex_backup(ps->lexer, next);
|
||||
tree->type = AST_IDENT;
|
||||
tree = make_tree(AST_IDENT, ps->lexer->cur_loc);
|
||||
tree->ident = t.ident;
|
||||
}
|
||||
return tree;
|
||||
|
@ -454,7 +453,6 @@ atom(ParserState *ps)
|
|||
return tree;
|
||||
default:
|
||||
parse_error(ps, "expected a number, identifier or expression, not '%s'", TokenIdStr[t.id]);
|
||||
free(tree);
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue