Add better error correcting code for bad loops in parser
This commit is contained in:
45
parser.c
45
parser.c
@@ -55,7 +55,7 @@ char *ast_to_str(node_t *ast, size_t size)
|
|||||||
struct PResult parse_buffer(buffer_t *buffer)
|
struct PResult parse_buffer(buffer_t *buffer)
|
||||||
{
|
{
|
||||||
node_t *nodes = NULL;
|
node_t *nodes = NULL;
|
||||||
size_t usable = 0, loops = 0;
|
size_t usable = 0, loops = 0, loop_ends = 0;
|
||||||
|
|
||||||
// First pass: Compute |nodes|
|
// First pass: Compute |nodes|
|
||||||
for (size_t i = 0; i < buffer->size; ++i)
|
for (size_t i = 0; i < buffer->size; ++i)
|
||||||
@@ -64,7 +64,44 @@ struct PResult parse_buffer(buffer_t *buffer)
|
|||||||
++usable;
|
++usable;
|
||||||
if (buffer->data[i] == '[')
|
if (buffer->data[i] == '[')
|
||||||
++loops;
|
++loops;
|
||||||
|
else if (buffer->data[i] == ']')
|
||||||
|
++loop_ends;
|
||||||
}
|
}
|
||||||
|
if (loops != loop_ends)
|
||||||
|
{
|
||||||
|
// Look for the point of failure
|
||||||
|
i64 stack = 0;
|
||||||
|
for (size_t i = 0, col = 0, row = 0; i < buffer->size; ++i)
|
||||||
|
{
|
||||||
|
if (buffer->data[i] == '\n')
|
||||||
|
{
|
||||||
|
col = 0;
|
||||||
|
++row;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (buffer->data[i] != ']' && buffer->data[i] != '[')
|
||||||
|
{
|
||||||
|
++col;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (buffer->data[i] == ']')
|
||||||
|
{
|
||||||
|
--stack;
|
||||||
|
}
|
||||||
|
else if (buffer->data[i] == '[')
|
||||||
|
{
|
||||||
|
++stack;
|
||||||
|
}
|
||||||
|
++col;
|
||||||
|
|
||||||
|
if (stack < 0)
|
||||||
|
{
|
||||||
|
print_error(buffer->name, row, col,
|
||||||
|
"ERROR: Unbalanced square brackets!");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
nodes = calloc(usable, sizeof(*nodes));
|
nodes = calloc(usable, sizeof(*nodes));
|
||||||
if (!nodes)
|
if (!nodes)
|
||||||
{
|
{
|
||||||
@@ -133,12 +170,6 @@ struct PResult parse_buffer(buffer_t *buffer)
|
|||||||
stack[stackptr++] = node;
|
stack[stackptr++] = node;
|
||||||
else if (node->type == LOUT)
|
else if (node->type == LOUT)
|
||||||
{
|
{
|
||||||
if (stackptr == 0)
|
|
||||||
{
|
|
||||||
print_error(buffer->name, node->row, node->col,
|
|
||||||
"ERROR: Unbalanced square brackets!");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
// Access last IN loop
|
// Access last IN loop
|
||||||
--stackptr;
|
--stackptr;
|
||||||
node->loop_ref = stack[stackptr] - nodes;
|
node->loop_ref = stack[stackptr] - nodes;
|
||||||
|
|||||||
Reference in New Issue
Block a user