allocate AST node only when needed

This commit is contained in:
tocariimaa 2025-01-30 23:37:17 -03:00
parent 8cd31829ad
commit 91375ea572

View file

@ -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;
}