fix: clear first AST node if got error inside parse_program
This commit is contained in:
+41
-50
@@ -1,5 +1,5 @@
|
|||||||
#include "compiler/fzl_token.h"
|
|
||||||
#include <compiler/fzl_parser.h>
|
#include <compiler/fzl_parser.h>
|
||||||
|
#include <compiler/fzl_token.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -166,22 +166,29 @@ fzl_node_t *parse_primary(fzl_parser_t *parser)
|
|||||||
|
|
||||||
while (peek(parser) && peek(parser)->type != FZL_TOKTYPE_STR_FORMAT_END)
|
while (peek(parser) && peek(parser)->type != FZL_TOKTYPE_STR_FORMAT_END)
|
||||||
{
|
{
|
||||||
if (remainder <= count)
|
|
||||||
{
|
|
||||||
remainder *= 2;
|
|
||||||
entries = realloc(entries, remainder * sizeof(fzl_node_t *));
|
|
||||||
if (!entries)
|
|
||||||
{
|
|
||||||
snprintf(plast_err, sizeof(plast_err), "out of memory");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is(parser, FZL_TOKTYPE_STR_FORMAT_END))
|
if (is(parser, FZL_TOKTYPE_STR_FORMAT_END))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (remainder <= count)
|
||||||
|
{
|
||||||
|
remainder *= 2;
|
||||||
|
fzl_node_t **newentries =
|
||||||
|
realloc(entries, remainder * sizeof(fzl_node_t *));
|
||||||
|
if (!newentries)
|
||||||
|
{
|
||||||
|
snprintf(plast_err, sizeof(plast_err), "out of memory");
|
||||||
|
for (size_t i = 0; i < count; i++)
|
||||||
|
fzl_freeast(entries[i]);
|
||||||
|
|
||||||
|
free(entries);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
entries = newentries;
|
||||||
|
}
|
||||||
|
|
||||||
fzl_node_t *expr = parse_expression(parser);
|
fzl_node_t *expr = parse_expression(parser);
|
||||||
if (!expr)
|
if (expr == NULL)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < count; i++)
|
for (size_t i = 0; i < count; i++)
|
||||||
fzl_freeast(entries[i]);
|
fzl_freeast(entries[i]);
|
||||||
@@ -192,6 +199,7 @@ fzl_node_t *parse_primary(fzl_parser_t *parser)
|
|||||||
|
|
||||||
entries[count++] = expr;
|
entries[count++] = expr;
|
||||||
}
|
}
|
||||||
|
|
||||||
fzl_token_t *end = consume(parser);
|
fzl_token_t *end = consume(parser);
|
||||||
if (end->type != FZL_TOKTYPE_STR_FORMAT_END)
|
if (end->type != FZL_TOKTYPE_STR_FORMAT_END)
|
||||||
{
|
{
|
||||||
@@ -644,8 +652,8 @@ fzl_node_t *parse_new(fzl_parser_t *parser)
|
|||||||
|
|
||||||
fzl_token_t *new = consume(parser);
|
fzl_token_t *new = consume(parser);
|
||||||
fzl_node_t *objname = parse_or(parser);
|
fzl_node_t *objname = parse_or(parser);
|
||||||
if (objname->type != FZL_NODETYPE_IDENTIFIER &&
|
if (!objname || (objname->type != FZL_NODETYPE_IDENTIFIER &&
|
||||||
objname->type != FZL_NODETYPE_FIELD)
|
objname->type != FZL_NODETYPE_FIELD))
|
||||||
{
|
{
|
||||||
fzl_freeast(objname);
|
fzl_freeast(objname);
|
||||||
snprintf(plast_err, sizeof(plast_err),
|
snprintf(plast_err, sizeof(plast_err),
|
||||||
@@ -1332,7 +1340,10 @@ fzl_node_t *parse_program(fzl_parser_t *parser)
|
|||||||
{
|
{
|
||||||
node = parse_statement(parser);
|
node = parse_statement(parser);
|
||||||
if (!node)
|
if (!node)
|
||||||
|
{
|
||||||
|
fzl_freeast(first);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!last)
|
if (!last)
|
||||||
{
|
{
|
||||||
@@ -1398,50 +1409,35 @@ void fzl_freeast(fzl_node_t *root)
|
|||||||
if (root->list.entries)
|
if (root->list.entries)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < root->list.entry_count; i++)
|
for (size_t i = 0; i < root->list.entry_count; i++)
|
||||||
if (root->list.entries[i])
|
fzl_freeast(root->list.entries[i]);
|
||||||
fzl_freeast(root->list.entries[i]);
|
|
||||||
|
|
||||||
free(root->list.entries);
|
free(root->list.entries);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FZL_NODETYPE_CALL:
|
case FZL_NODETYPE_CALL:
|
||||||
if (root->call.callee)
|
fzl_freeast(root->call.callee);
|
||||||
fzl_freeast(root->call.callee);
|
|
||||||
|
|
||||||
if (root->call.args_count)
|
if (root->call.args_count)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < root->call.args_count; i++)
|
for (size_t i = 0; i < root->call.args_count; i++)
|
||||||
if (root->call.args[i])
|
fzl_freeast(root->call.args[i]);
|
||||||
fzl_freeast(root->call.args[i]);
|
|
||||||
}
|
}
|
||||||
if (root->call.args)
|
if (root->call.args)
|
||||||
free(root->call.args);
|
free(root->call.args);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FZL_NODETYPE_CONDITIONAL:
|
case FZL_NODETYPE_CONDITIONAL:
|
||||||
if (root->cond.condition)
|
fzl_freeast(root->cond.condition);
|
||||||
fzl_freeast(root->cond.condition);
|
fzl_freeast(root->cond.true_block);
|
||||||
|
fzl_freeast(root->cond.else_block);
|
||||||
if (root->cond.true_block)
|
|
||||||
fzl_freeast(root->cond.true_block);
|
|
||||||
|
|
||||||
if (root->cond.else_block)
|
|
||||||
fzl_freeast(root->cond.else_block);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FZL_NODETYPE_LOOP:
|
case FZL_NODETYPE_LOOP:
|
||||||
if (root->loop.init)
|
fzl_freeast(root->loop.init);
|
||||||
fzl_freeast(root->loop.init);
|
fzl_freeast(root->loop.cond);
|
||||||
|
fzl_freeast(root->loop.step);
|
||||||
if (root->loop.cond)
|
fzl_freeast(root->loop.body);
|
||||||
fzl_freeast(root->loop.cond);
|
|
||||||
|
|
||||||
if (root->loop.step)
|
|
||||||
fzl_freeast(root->loop.step);
|
|
||||||
|
|
||||||
if (root->loop.body)
|
|
||||||
fzl_freeast(root->loop.body);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FZL_NODETYPE_ADD:
|
case FZL_NODETYPE_ADD:
|
||||||
@@ -1459,17 +1455,14 @@ void fzl_freeast(fzl_node_t *root)
|
|||||||
case FZL_NODETYPE_GREATER:
|
case FZL_NODETYPE_GREATER:
|
||||||
case FZL_NODETYPE_GREATER_EQUAL:
|
case FZL_NODETYPE_GREATER_EQUAL:
|
||||||
case FZL_NODETYPE_ASSIGN:
|
case FZL_NODETYPE_ASSIGN:
|
||||||
if (root->binary_op.left)
|
fzl_freeast(root->binary_op.left);
|
||||||
fzl_freeast(root->binary_op.left);
|
fzl_freeast(root->binary_op.right);
|
||||||
if (root->binary_op.right)
|
|
||||||
fzl_freeast(root->binary_op.right);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FZL_NODETYPE_UNARY_PLUS:
|
case FZL_NODETYPE_UNARY_PLUS:
|
||||||
case FZL_NODETYPE_UNARY_MINUS:
|
case FZL_NODETYPE_UNARY_MINUS:
|
||||||
case FZL_NODETYPE_NOT:
|
case FZL_NODETYPE_NOT:
|
||||||
if (root->unary_op.operand)
|
fzl_freeast(root->unary_op.operand);
|
||||||
fzl_freeast(root->unary_op.operand);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FZL_NODETYPE_FUNCTION:
|
case FZL_NODETYPE_FUNCTION:
|
||||||
@@ -1481,8 +1474,7 @@ void fzl_freeast(fzl_node_t *root)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case FZL_NODETYPE_RETURN:
|
case FZL_NODETYPE_RETURN:
|
||||||
if (root->ret.value)
|
fzl_freeast(root->ret.value);
|
||||||
fzl_freeast(root->ret.value);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FZL_NODETYPE_CLASS:
|
case FZL_NODETYPE_CLASS:
|
||||||
@@ -1507,8 +1499,7 @@ void fzl_freeast(fzl_node_t *root)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case FZL_NODETYPE_DECLARATION:
|
case FZL_NODETYPE_DECLARATION:
|
||||||
if (root->var.identifier)
|
fzl_freeast(root->var.identifier);
|
||||||
fzl_freeast(root->var.identifier);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
printline($"Something's on the {way}")
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$"jopa {abc}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
int a1 = 2 * 2;
|
||||||
|
printline($"First tests: build string and print. 2 * 2 = {a1}");
|
||||||
|
|
||||||
|
str a2 = "Mike Tyson";
|
||||||
|
printline($"Hello, {a2}");
|
||||||
|
|
||||||
Reference in New Issue
Block a user