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 *
|
static Ast *
|
||||||
atom(ParserState *ps)
|
atom(ParserState *ps)
|
||||||
{
|
{
|
||||||
Ast *tree = make_tree(AST_INVALID, ps->lexer->cur_loc);
|
Ast *tree = nil;
|
||||||
LexToken t = lex_scan(ps->lexer);
|
LexToken t = lex_scan(ps->lexer);
|
||||||
LexToken next;
|
LexToken next;
|
||||||
|
|
||||||
switch (t.id) {
|
switch (t.id) {
|
||||||
case T_NUMBER:
|
case T_NUMBER:
|
||||||
tree->type = AST_NUMBER;
|
tree = make_tree(AST_NUMBER, ps->lexer->cur_loc);
|
||||||
tree->number.n = t.inumber;
|
tree->number.n = t.inumber;
|
||||||
trace("number in atom: %lu\n", t.inumber);
|
trace("number in atom: %lu\n", t.inumber);
|
||||||
return tree;
|
return tree;
|
||||||
case T_STRING:
|
case T_STRING:
|
||||||
tree->type = AST_STRLIT;
|
tree = make_tree(AST_STRLIT, ps->lexer->cur_loc);
|
||||||
tree->strlit = t.str;
|
tree->strlit = t.str;
|
||||||
return tree;
|
return tree;
|
||||||
case T_IDENT:
|
case T_IDENT:
|
||||||
next = lex_scan(ps->lexer);
|
next = lex_scan(ps->lexer);
|
||||||
/* It is a plain symbol or a function call? */
|
/* It is a plain symbol or a function call? */
|
||||||
if (next.id == T_LPAREN) {
|
if (next.id == T_LPAREN) {
|
||||||
free(tree);
|
|
||||||
tree = function_call(ps, t.ident, true);
|
tree = function_call(ps, t.ident, true);
|
||||||
} else {
|
} else {
|
||||||
lex_backup(ps->lexer, next);
|
lex_backup(ps->lexer, next);
|
||||||
tree->type = AST_IDENT;
|
tree = make_tree(AST_IDENT, ps->lexer->cur_loc);
|
||||||
tree->ident = t.ident;
|
tree->ident = t.ident;
|
||||||
}
|
}
|
||||||
return tree;
|
return tree;
|
||||||
|
@ -454,7 +453,6 @@ atom(ParserState *ps)
|
||||||
return tree;
|
return tree;
|
||||||
default:
|
default:
|
||||||
parse_error(ps, "expected a number, identifier or expression, not '%s'", TokenIdStr[t.id]);
|
parse_error(ps, "expected a number, identifier or expression, not '%s'", TokenIdStr[t.id]);
|
||||||
free(tree);
|
|
||||||
}
|
}
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue