all: fixed memleaks; compiler: closures work

This commit is contained in:
2017-09-07 17:41:27 +02:00
parent a37ec816e6
commit 682bc9db60
9 changed files with 180 additions and 44 deletions

View File

@@ -86,7 +86,7 @@ sc_ast* read_token(char* inp) {
return make_atom(inp);
}
parse_state* read_tokens(parse_state* state) {
void read_tokens(parse_state* state) {
char* token = state->tokens[0];
state->tokens++;
int n = state->node->n_children++;
@@ -100,7 +100,7 @@ parse_state* read_tokens(parse_state* state) {
nstate->tokens = state->tokens;
while (strncmp(nstate->tokens[0], ")", 2)) {
nstate = read_tokens(nstate);
read_tokens(nstate);
}
state->node->children[n] = nstate->node;
@@ -109,8 +109,6 @@ parse_state* read_tokens(parse_state* state) {
} else {
state->node->children[n] = read_token(token);
}
return state;
}
sc_ast* sc_parse(char* input) {
@@ -119,27 +117,16 @@ sc_ast* sc_parse(char* input) {
state->tokens = tokens;
state->node = make_pseudo();
while (state->tokens[0]) state = read_tokens(state);
while (state->tokens[0]) read_tokens(state);
return state->node;
}
const char* tag_to_string(int x) {
switch(x) {
case PSEUDO: return "pseudo";
case ATOM: return "atom";
case STRING: return "string";
case INT: return "int";
case FLOAT: return "float";
case LIST: return "list";
default: {char* t=malloc(3); snprintf(t, 3, "%d", x); return t;}
char** t = tokens;
while(t[0]) {
if (!strcmp(t[0], "(") || !strcmp(t[0], ")")) free(t[0]);
t++;
}
}
void sc_ast_print(sc_ast* ast) {
int i;
printf("%s: %s\n", tag_to_string(ast->tag), ast->value);
for (i = 0; i < ast->n_children; ++i) sc_ast_print(ast->children[i]);
free(tokens);
sc_ast* ast = state->node;
free(state);
return ast;
}