]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
Fixed bug in lexer when releasing tokens
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 30 Sep 2014 19:28:37 +0000 (15:28 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 30 Sep 2014 19:28:37 +0000 (15:28 -0400)
source/sclpl/grammar.c
source/sclpl/lexer.c
source/sclpl/main.c
source/sclpl/parser.c

index 535863d70c629153712cd03038f99e8425a91764..c2a0a79979f63563de993def5c12c4ddd6dd5e1d 100644 (file)
@@ -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")) {
index c5ea780e97038eb7d5e22649e2fb3b56a3b14477..37cb1fb3d148d2bf392b4f575498d2751660e4e8 100644 (file)
@@ -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) {
index 2dc49040838b6d51b9da8209443647cc5b6681a4..44a681f8609702438bf4740b2e89db4779a241a0 100644 (file)
@@ -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:
index c359e02d5343351549051c1c7b926c3a1ec3f4ef..c928de81c857dadcd650a788efa00b49a025295a 100644 (file)
@@ -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) {