Fix errors due to no loops
This commit is contained in:
15
assembler.c
15
assembler.c
@@ -120,12 +120,15 @@ void asm_translate_nodes(buffer_t **asm_buffer, struct PResult nodes,
|
|||||||
const char *src_name)
|
const char *src_name)
|
||||||
{
|
{
|
||||||
// First pass: Setup the ASM label array
|
// First pass: Setup the ASM label array
|
||||||
struct Label labels[nodes.labels * 2];
|
struct Label labels[nodes.labels ? nodes.labels * 2 : 1];
|
||||||
u64 label_ptr = 0;
|
if (nodes.labels)
|
||||||
for (size_t i = 0; i < nodes.size; ++i)
|
{
|
||||||
if (nodes.nodes[i].type == LIN || nodes.nodes[i].type == LOUT)
|
u64 label_ptr = 0;
|
||||||
labels[label_ptr++] =
|
for (size_t i = 0; i < nodes.size; ++i)
|
||||||
(struct Label){.cur = i, .next = nodes.nodes[i].loop_ref};
|
if (nodes.nodes[i].type == LIN || nodes.nodes[i].type == LOUT)
|
||||||
|
labels[label_ptr++] =
|
||||||
|
(struct Label){.cur = i, .next = nodes.nodes[i].loop_ref};
|
||||||
|
}
|
||||||
|
|
||||||
// Second pass: Translating to assembly
|
// Second pass: Translating to assembly
|
||||||
for (size_t i = 0; i < nodes.size; ++i)
|
for (size_t i = 0; i < nodes.size; ++i)
|
||||||
|
|||||||
33
parser.c
33
parser.c
@@ -121,26 +121,29 @@ struct PResult parse_buffer(buffer_t *buffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Third pass: setup loop references
|
// Third pass: setup loop references
|
||||||
node_t *stack[loops];
|
|
||||||
memset(stack, 0, loops);
|
|
||||||
size_t stackptr = 0;
|
size_t stackptr = 0;
|
||||||
for (size_t i = 0; i < usable; ++i)
|
if (loops)
|
||||||
{
|
{
|
||||||
node_t *node = nodes + i;
|
node_t *stack[loops];
|
||||||
if (node->type == LIN)
|
memset(stack, 0, loops);
|
||||||
stack[stackptr++] = node;
|
for (size_t i = 0; i < usable; ++i)
|
||||||
else if (node->type == LOUT)
|
|
||||||
{
|
{
|
||||||
if (stackptr == 0)
|
node_t *node = nodes + i;
|
||||||
|
if (node->type == LIN)
|
||||||
|
stack[stackptr++] = node;
|
||||||
|
else if (node->type == LOUT)
|
||||||
{
|
{
|
||||||
print_error(buffer->name, node->row, node->col,
|
if (stackptr == 0)
|
||||||
"ERROR: Unbalanced square brackets!");
|
{
|
||||||
goto error;
|
print_error(buffer->name, node->row, node->col,
|
||||||
|
"ERROR: Unbalanced square brackets!");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
// Access last IN loop
|
||||||
|
--stackptr;
|
||||||
|
node->loop_ref = stack[stackptr] - nodes;
|
||||||
|
stack[stackptr]->loop_ref = i;
|
||||||
}
|
}
|
||||||
// Access last IN loop
|
|
||||||
--stackptr;
|
|
||||||
node->loop_ref = stack[stackptr] - nodes;
|
|
||||||
stack[stackptr]->loop_ref = i;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user