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")) {
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) {
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:
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);
}
}
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) {