From: Michael D. Lowis Date: Tue, 30 Sep 2014 19:28:37 +0000 (-0400) Subject: Fixed bug in lexer when releasing tokens X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=63fc269f707cc3932703af6b94ef935c92da0b4a;p=proto%2Fsclpl.git Fixed bug in lexer when releasing tokens --- diff --git a/source/sclpl/grammar.c b/source/sclpl/grammar.c index 535863d..c2a0a79 100644 --- a/source/sclpl/grammar.c +++ b/source/sclpl/grammar.c @@ -42,8 +42,10 @@ void grammar_definition(parser_t* p_parser) void grammar_expression(parser_t* p_parser) { if (parser_accept(p_parser, T_LPAR)) { + size_t mark = parser_mark(p_parser); grammar_expression(p_parser); - parser_accept(p_parser, T_RPAR); + parser_expect(p_parser, T_RPAR); + parser_reduce(p_parser, mark); } else if (parser_accept_str(p_parser, T_VAR, "if")) { grammar_if_stmnt(p_parser); } else if (parser_accept_str(p_parser, T_VAR, "fn")) { diff --git a/source/sclpl/lexer.c b/source/sclpl/lexer.c index c5ea780..37cb1fb 100644 --- a/source/sclpl/lexer.c +++ b/source/sclpl/lexer.c @@ -27,7 +27,8 @@ static int read_radix(char ch); static void lex_tok_free(void* p_obj) { lex_tok_t* p_tok = (lex_tok_t*)p_obj; - mem_release(p_tok->value); + if (NULL != p_tok->value) + mem_release(p_tok->value); } static lex_tok_t* lex_tok_new(lex_tok_type_t type, void* val) { diff --git a/source/sclpl/main.c b/source/sclpl/main.c index 2dc4904..44a681f 100644 --- a/source/sclpl/main.c +++ b/source/sclpl/main.c @@ -19,20 +19,27 @@ void print_subtree(tree_t* p_tree, int depth); void print_tree(vec_t* p_vec, int depth); void print_subtree(tree_t* p_tree, int depth) { + puts("printing subtree"); for(int i = 0; i < (4 * depth); i++) printf("%c", ' '); if (p_tree->tag == ATOM) { - puts("ATOM"); + printf("ATOM (%p)\n", p_tree); } else { - puts("TREE"); + printf("TREE (%p)\n", p_tree); print_tree(p_tree->ptr.vec, depth+1); } + puts("printed subtree"); } void print_tree(vec_t* p_vec, int depth) { + puts("printing tree"); for(size_t idx = 0; idx < vec_size(p_vec); idx++) { - tree_t* p_tree = vec_at(p_vec, idx); + puts("("); + tree_t* p_tree = (tree_t*)vec_at(p_vec, idx); + puts("-"); print_subtree(p_tree, depth); + puts(")"); } + puts("printed tree"); } /* TODO: diff --git a/source/sclpl/parser.c b/source/sclpl/parser.c index c359e02..c928de8 100644 --- a/source/sclpl/parser.c +++ b/source/sclpl/parser.c @@ -11,8 +11,9 @@ lex_tok_t tok_eof = { T_END_FILE, NULL, 0, 0, NULL }; static void parser_free(void* p_obj) { parser_t* p_parser = (parser_t*)p_obj; - if ((NULL != p_parser->p_tok) && (&tok_eof != p_parser->p_tok)) + if ((NULL != p_parser->p_tok) && (&tok_eof != p_parser->p_tok)) { mem_release(p_parser->p_tok); + } mem_release(p_parser->p_lexer); mem_release(p_parser->p_tok_buf); } @@ -27,7 +28,10 @@ parser_t* parser_new(char* p_prompt, FILE* input) } static void parser_tree_free(void* p_obj) { - mem_release(((tree_t*)p_obj)->ptr.tok); + tree_t* p_tree = ((tree_t*)p_obj); + if (NULL != p_tree->ptr.tok) { + mem_release(p_tree->ptr.tok); + } } static tree_t* parser_tree_new(tree_tag_t tag, void* p_obj) {