all: fixed memleaks; compiler: closures work
This commit is contained in:
37
src/parser.c
37
src/parser.c
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user