void syntax_free(syntax* t) { if(t==NULL)return; switch (t->tag) { case syntax_NIL: return; case syntax_BIN: syntax_free(((syntax_bin*)t)->l); syntax_free(((syntax_bin*)t)->r); break; case syntax_IF: syntax_free(((syntax_if*)t)->e1); syntax_free(((syntax_if*)t)->e2); syntax_free(((syntax_if*)t)->e3); break; case syntax_LET: syntax_free(((syntax_let*)t)->e1); syntax_free(((syntax_let*)t)->e2); break; case syntax_LAMBDA: syntax_free(((syntax_lambda*)t)->env); syntax_free(((syntax_lambda*)t)->e1); break; case syntax_DOUBLE: case syntax_BOOL: case syntax_VAR: case syntax_PRE: break; } free(t); }
int main(int argc, const char**argv) { parse_string("1+2*3"); syntax_pp(state.lval, 0); syntax_free(state.lval); parse_string("(1+2) * "); syntax_pp(state.lval, 0); syntax_free(state.lval); return 0; }
void syntax_free(syntax* t) { if(t==NULL)return; switch (t->tag) { case syntax_BIN: syntax_free(((syntax_bin*)t)->l); syntax_free(((syntax_bin*)t)->r); break; default: break; } free(t); }
void syntax_free(syntax* t) { if(t!=NULL) switch (t->tag) { case syntax_BIN: syntax_free(((syntax_bin*)t)->l); free(((syntax_bin*)t)->op); syntax_free(((syntax_bin*)t)->r); break; default: free(t); break; } }
/* * Load a (possibly cached) syntax. If the cache exists, use it * in preference to anything else. * * We remember the INODE of the cached file instead of the * modification timestamp. This is because there may be multiple * people using the same CLI. If one updates the syntax, we want * the other one to see only the finished new version, and not * any intermediate version. This requirement means that * updating the syntax has to be done as an atomic operation, i.e. * * $ ./bin/rehash > ./cache/syntax.txt.new * $ mv ./cache/syntax.txt.new ./cache/syntax.txt */ int recli_load_syntax(recli_config_t *config) { struct stat statbuf; cli_syntax_t *head = NULL; char buffer[8192]; snprintf(buffer, sizeof(buffer), "%s/cache/syntax.txt", config->dir); if (stat(buffer, &statbuf) == 0) { if (config->syntax_inode == statbuf.st_ino) return 0; if (syntax_parse_file(buffer, &head) < 0) return -1; config->syntax_inode = statbuf.st_ino; } else { snprintf(buffer, sizeof(buffer), "%s/bin/", config->dir); if (recli_load_dirs(&head, buffer, strlen(buffer), config->envp) < 0) return -1; /* * FIXME: dump syntax to syntax.cache file, and * update cached inode. */ } if (config->syntax) syntax_free(config->syntax); config->syntax = head; return 0; }
int main(int argc, const char**argv) { eval_init(); parser_state state; parse_string(&state, "1+2*3"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "1"); syntax_p(state.lval, 0); //printf("eval %lf\n", eval(state.lval)); syntax_free(state.lval); parse_string(&state, "abc"); syntax_p(state.lval, 0); //printf("eval %lf\n", eval(state.lval)); syntax_free(state.lval); parse_string(&state, "1::2+3::()"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "(a::2)::(b::3)::()"); syntax* env = state.lval; syntax_p(state.lval, 0); syntax_p(lookup(env, "a"), 0); syntax_p(lookup(env, "b"), 0); syntax_p(lookup(env, "c"), 0); syntax_free(env); parse_string(&state, "abc -> abc"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "(abc -> abc)10"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "let abc=1 in abc"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "let abc=2 in if abc<=1 then 1 else 2"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "let abc=0 in if abc<=1 then 1 else 2"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "let abc=0 in abc<=1"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "let abc=2 in abc<=1"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "(x -> x + 1)1"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "let rec abc=1 in abc"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "let rec sum = \n" " x -> if x <= 0 then 0 else x + sum (x-1) \n" "in \n" "sum 10\n"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "(1+2) * "); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "-1"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); parse_string(&state, "(x-> -x)(+1)"); syntax_p(state.lval, 0); syntax_p(eval(syntax_nil, state.lval), 0); syntax_free(state.lval); return 0; }