diff --git a/compiler/parse.c b/compiler/parse.c index 1bd8a36..e50528f 100644 --- a/compiler/parse.c +++ b/compiler/parse.c @@ -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; }