Add a function to print the parse tree.

This commit is contained in:
Danila Fedorin 2018-02-25 23:09:35 -08:00
parent c18a5e49de
commit 65071d47b3
3 changed files with 57 additions and 1 deletions

View File

@ -8,7 +8,7 @@ project(libabacus)
add_compile_options(-pedantic -Wall) add_compile_options(-pedantic -Wall)
add_library(abacus STATIC src/lexer.c src/util.c src/table.c src/parser.c src/libabacus.c src/tree.c) add_library(abacus STATIC src/lexer.c src/util.c src/table.c src/parser.c src/libabacus.c src/tree.c src/debug.c)
add_executable(libabacus src/main.c) add_executable(libabacus src/main.c)
add_subdirectory(external/liblex) add_subdirectory(external/liblex)

8
include/debug.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef LIBABACUS_DEBUG_H
#define LIBABACUS_DEBUG_H
#include "tree.h"
void libab_debug_print_tree(libab_tree* print);
#endif

48
src/debug.c Normal file
View File

@ -0,0 +1,48 @@
#include "debug.h"
#include <stdio.h>
int _debug_foreach_print_tree(void* data, va_list args);
const char* _debug_node_name(libab_tree_variant var) {
static const char* names[] = {
"none",
"base",
"id",
"num",
"op",
"unary_op",
"block",
"void",
"if",
"call"
};
return names[var];
}
void _debug_print_tree_node(libab_tree* tree) {
printf("%s", _debug_node_name(tree->variant));
if(libab_tree_has_string(tree->variant)) {
printf(": %s", tree->string_value);
}
printf("\n");
}
void _debug_print_tree(libab_tree* tree, int depth) {
int i = depth;
while(i--) printf(" ");
_debug_print_tree_node(tree);
if(libab_tree_has_vector(tree->variant)) {
vec_foreach(&tree->children, NULL, compare_always,
_debug_foreach_print_tree, depth + 1);
}
}
int _debug_foreach_print_tree(void* data, va_list args) {
int depth = va_arg(args, int);
_debug_print_tree(data, depth);
return 0;
}
void libab_debug_print_tree(libab_tree* print) {
_debug_print_tree(print, 0);
}