ADD: var index.
parent
d8f1af99a6
commit
067dfdc638
|
@ -42,7 +42,8 @@ void compile_node(compiler* self, node* root, program* prog)
|
||||||
size_t id = symtable_declare(
|
size_t id = symtable_declare(
|
||||||
self->sym,
|
self->sym,
|
||||||
root->children.data[0]->value,
|
root->children.data[0]->value,
|
||||||
ty
|
ty,
|
||||||
|
root->children.data[1]
|
||||||
);
|
);
|
||||||
|
|
||||||
compile_node(self, root->children.data[1], prog);
|
compile_node(self, root->children.data[1], prog);
|
||||||
|
|
|
@ -119,6 +119,13 @@ type* cstatic_resolve_new(cstatic* self, symtable* sym, node* ast)
|
||||||
// find inner type using first array element
|
// find inner type using first array element
|
||||||
size_t dim = ast->children.data[1]->children.size;
|
size_t dim = ast->children.data[1]->children.size;
|
||||||
node* iter = ast->children.data[0];
|
node* iter = ast->children.data[0];
|
||||||
|
|
||||||
|
if (iter->type == NODE_IDENT)
|
||||||
|
{
|
||||||
|
symentry* entry = symtable_find(sym,
|
||||||
|
iter->value);
|
||||||
|
iter = entry->sym_node;
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i=0; i<dim; i++)
|
for (size_t i=0; i<dim; i++)
|
||||||
{
|
{
|
||||||
|
@ -218,15 +225,23 @@ int cstatic_check(cstatic* self, node* ast, symtable* sym, char* msg, size_t siz
|
||||||
// check dimension
|
// check dimension
|
||||||
size_t dim = ast->children.data[1]->children.size;
|
size_t dim = ast->children.data[1]->children.size;
|
||||||
size_t real_dim = 0;
|
size_t real_dim = 0;
|
||||||
|
|
||||||
node* iter = ast->children.data[0];
|
node* iter = ast->children.data[0];
|
||||||
|
|
||||||
|
if (iter->type == NODE_IDENT)
|
||||||
|
{
|
||||||
|
symentry* entry = symtable_find(sym,
|
||||||
|
iter->value);
|
||||||
|
iter = entry->sym_node;
|
||||||
|
}
|
||||||
|
|
||||||
while (iter->type == NODE_ARRAY)
|
while (iter->type == NODE_ARRAY)
|
||||||
{
|
{
|
||||||
iter = iter->children.data[0];
|
iter = iter->children.data[0];
|
||||||
real_dim++;
|
real_dim++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (real_dim != dim)
|
if (real_dim < dim)
|
||||||
{
|
{
|
||||||
snprintf(msg, size,
|
snprintf(msg, size,
|
||||||
"E: array dimension mismatch:"
|
"E: array dimension mismatch:"
|
||||||
|
@ -308,7 +323,7 @@ int cstatic_check(cstatic* self, node* ast, symtable* sym, char* msg, size_t siz
|
||||||
|
|
||||||
type* ty = cstatic_resolve_new(self, sym, ast->children.data[1]);
|
type* ty = cstatic_resolve_new(self, sym, ast->children.data[1]);
|
||||||
assert(ty);
|
assert(ty);
|
||||||
symtable_declare(sym, name, ty);
|
symtable_declare(sym, name, ty, ast->children.data[1]);
|
||||||
type_free(ty);
|
type_free(ty);
|
||||||
free(ty);
|
free(ty);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
13
src/node.c
13
src/node.c
|
@ -36,6 +36,19 @@ void node_free(node* self)
|
||||||
self->children.capacity = 0;
|
self->children.capacity = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node* node_new_clone(node* self)
|
||||||
|
{
|
||||||
|
assert(self);
|
||||||
|
node* clone = malloc(sizeof(node));
|
||||||
|
node_init(clone, self->type, self->value, self->lineno);
|
||||||
|
|
||||||
|
for (size_t i=0; i<self->children.size; i++)
|
||||||
|
{
|
||||||
|
node_add_child(clone, node_new_clone(self->children.data[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
void node_add_child(node* self, node* child)
|
void node_add_child(node* self, node* child)
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,6 +38,8 @@ typedef struct node {
|
||||||
void node_init(node* self, int type, char const* value, int lineno);
|
void node_init(node* self, int type, char const* value, int lineno);
|
||||||
void node_free(node* self);
|
void node_free(node* self);
|
||||||
|
|
||||||
|
node* node_new_clone(node* self);
|
||||||
|
|
||||||
void node_add_child(node* self, node* child);
|
void node_add_child(node* self, node* child);
|
||||||
|
|
||||||
size_t node_str(node* self, char* buffer, size_t size);
|
size_t node_str(node* self, char* buffer, size_t size);
|
||||||
|
|
|
@ -79,7 +79,7 @@ exprs:
|
||||||
|
|
||||||
expr:
|
expr:
|
||||||
// INDEX
|
// INDEX
|
||||||
array array {
|
expr array {
|
||||||
node *n = malloc(sizeof(node));
|
node *n = malloc(sizeof(node));
|
||||||
node_init(n, NODE_INDEX, "", line);
|
node_init(n, NODE_INDEX, "", line);
|
||||||
size_t const SZ = $1 + $2;
|
size_t const SZ = $1 + $2;
|
||||||
|
|
|
@ -4,7 +4,7 @@ void symtable_init(symtable* self)
|
||||||
{
|
{
|
||||||
assert(self);
|
assert(self);
|
||||||
self->id = 0;
|
self->id = 0;
|
||||||
|
|
||||||
self->entries.size = 0;
|
self->entries.size = 0;
|
||||||
self->entries.capacity = 1;
|
self->entries.capacity = 1;
|
||||||
self->entries.data = malloc(sizeof(symentry*)
|
self->entries.data = malloc(sizeof(symentry*)
|
||||||
|
@ -14,9 +14,13 @@ void symtable_init(symtable* self)
|
||||||
void symtable_free(symtable* self)
|
void symtable_free(symtable* self)
|
||||||
{
|
{
|
||||||
assert(self);
|
assert(self);
|
||||||
|
|
||||||
for (size_t i=0; i<self->entries.size; i++)
|
for (size_t i=0; i<self->entries.size; i++)
|
||||||
{
|
{
|
||||||
|
node_free(self->entries.data[i]->sym_node);
|
||||||
|
free(self->entries.data[i]->sym_node);
|
||||||
|
self->entries.data[i]->sym_node = NULL;
|
||||||
|
|
||||||
free(self->entries.data[i]->name);
|
free(self->entries.data[i]->name);
|
||||||
type_free(self->entries.data[i]->ty);
|
type_free(self->entries.data[i]->ty);
|
||||||
free(self->entries.data[i]->ty);
|
free(self->entries.data[i]->ty);
|
||||||
|
@ -30,7 +34,7 @@ void symtable_free(symtable* self)
|
||||||
self->entries.data = NULL;
|
self->entries.data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t symtable_declare(symtable* self, char const* name, type* ty)
|
size_t symtable_declare(symtable* self, char const* name, type* ty, node* sym_node)
|
||||||
{
|
{
|
||||||
assert(self);
|
assert(self);
|
||||||
|
|
||||||
|
@ -52,6 +56,7 @@ size_t symtable_declare(symtable* self, char const* name, type* ty)
|
||||||
self->entries.data[self->entries.size]->name = str_new(name);
|
self->entries.data[self->entries.size]->name = str_new(name);
|
||||||
self->entries.data[self->entries.size]->ty = type_new_clone(ty);
|
self->entries.data[self->entries.size]->ty = type_new_clone(ty);
|
||||||
self->entries.data[self->entries.size]->id = self->id;
|
self->entries.data[self->entries.size]->id = self->id;
|
||||||
|
self->entries.data[self->entries.size]->sym_node = node_new_clone(sym_node);
|
||||||
self->entries.size++;
|
self->entries.size++;
|
||||||
|
|
||||||
return self->id++;
|
return self->id++;
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
|
|
||||||
#include "commons.h"
|
#include "commons.h"
|
||||||
#include "type.h"
|
#include "type.h"
|
||||||
|
#include "node.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
size_t id;
|
size_t id;
|
||||||
char* name;
|
char* name;
|
||||||
type* ty;
|
type* ty;
|
||||||
|
node* sym_node;
|
||||||
} symentry;
|
} symentry;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -23,7 +25,7 @@ typedef struct {
|
||||||
void symtable_init(symtable* self);
|
void symtable_init(symtable* self);
|
||||||
void symtable_free(symtable* self);
|
void symtable_free(symtable* self);
|
||||||
|
|
||||||
size_t symtable_declare(symtable* self, char const* name, type* ty);
|
size_t symtable_declare(symtable* self, char const* name, type* ty, node* sym_node);
|
||||||
symentry* symtable_find(symtable* self, char const* name);
|
symentry* symtable_find(symtable* self, char const* name);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
4
src/vm.c
4
src/vm.c
|
@ -677,12 +677,12 @@ void vm_aderef(vm* self)
|
||||||
arr = val;
|
arr = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(val);
|
|
||||||
|
|
||||||
|
assert(val);
|
||||||
|
|
||||||
vm_push_value(self, val);
|
vm_push_value(self, val);
|
||||||
|
|
||||||
value_free(idx); free(idx);
|
value_free(idx); free(idx);
|
||||||
value_free(arr); free(arr);
|
|
||||||
|
|
||||||
self->pc++;
|
self->pc++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
let x = 0 x + 1.2
|
let x = 0 x + 1.2
|
||||||
let x = false x + "false"
|
let x = false x + "false"
|
||||||
let x=0 let x=7
|
let x=0 let x=7
|
||||||
|
let x=[1, 2] x[7, 9]
|
||||||
|
|
|
@ -25,4 +25,5 @@ assert [0, 1, 0, 1, 0, 1] == 3 * [0, 1]
|
||||||
|
|
||||||
assert [0, 0, 0, 0, 0, 0, 1] == 2 * (3 * [0]) + [1]
|
assert [0, 0, 0, 0, 0, 0, 1] == 2 * (3 * [0]) + [1]
|
||||||
|
|
||||||
|
assert [2, 4] == [[2, 4], [7, 9]][0]
|
||||||
|
assert [7, 9] == [[2, 4], [7, 9]][1]
|
||||||
|
|
|
@ -3,3 +3,13 @@ let b = 7
|
||||||
let c = a * b + 1
|
let c = a * b + 1
|
||||||
|
|
||||||
assert 29 == c
|
assert 29 == c
|
||||||
|
|
||||||
|
let d = [[2, 4], [6, 8]]
|
||||||
|
assert 6 == d[1, 0]
|
||||||
|
assert [2, 4] == d[0]
|
||||||
|
assert [6, 8] == d[1]
|
||||||
|
|
||||||
|
let e = 0
|
||||||
|
let f = 1
|
||||||
|
assert [2, 4] == d[e]
|
||||||
|
assert [6, 8] == d[f]
|
||||||
|
|
Loading…
Reference in New Issue