vety-language/parser/ast_printer.c

94 lines
6.0 KiB
C

#include "ast_printer.h"
#include "parser.h"
#include <stdio.h>
#include <stdlib.h>
static void print_indent(int level, int is_last) {
for(int i=0; i<level; i++) {
printf(" ");
}
printf(is_last ? BRANCH_CORNER HORIZONTAL_LINE HORIZONTAL_LINE " " : NODE_CORNER HORIZONTAL_LINE HORIZONTAL_LINE " ");
}
static void print_node(const char* type, const char* value, int level, int is_last) {
print_indent(level, is_last);
printf(COLOR_TYPE "%s" COLOR_RESET, type);
if(value) {
printf(": " COLOR_LITERAL "%s" COLOR_RESET, value);
}
}
static void print_ast_recursive(ASTNode *node, int level, int is_last) {
if(!node) return;
switch(node->type) {
case NODE_PROGRAM: print_node("PROGRAM", node->value, level, is_last); break;
case NODE_VAR_DECL: print_node("VAR_DECL", node->value, level, is_last); break;
case NODE_FUNC_DECL: print_node("FUNC_DECL", node->value, level, is_last); break;
case NODE_PARAM: print_node("PARAM", node->value, level, is_last); break;
case NODE_BLOCK: print_node("BLOCK", node->value, level, is_last); break;
case NODE_IF_STMT: print_node("IF_STMT", node->value, level, is_last); break;
case NODE_WHILE_STMT: print_node("WHILE_STMT", node->value, level, is_last); break;
case NODE_FOR_STMT: print_node("FOR_STMT", node->value, level, is_last); break;
case NODE_BREAK_STMT: print_node("BREAK_STMT", node->value, level, is_last); break;
case NODE_CONTINUE_STMT: print_node("CONTINUE_STMT", node->value, level, is_last); break;
case NODE_RETURN_STMT: print_node("RETURN_STMT", node->value, level, is_last); break;
case NODE_EXPR_STMT: print_node("EXPR_STMT", node->value, level, is_last); break;
case NODE_IMPORT_STMT: print_node("IMPORT_STMT", node->value, level, is_last); break;
case NODE_REQUEST_STMT: print_node("REQUEST_STMT", node->value, level, is_last); break;
case NODE_BINARY_EXPR: print_node("BINARY_EXPR", node->value, level, is_last); break;
case NODE_UNARY_EXPR: print_node("UNARY_EXPR", node->value, level, is_last); break;
case NODE_POSTFIX_EXPR: print_node("POSTFIX_EXPR", node->value, level, is_last); break;
case NODE_CALL_EXPR: print_node("CALL_EXPR", node->value, level, is_last); break;
case NODE_MEMBER_EXPR: print_node("MEMBER_EXPR", node->value, level, is_last); break;
case NODE_IDENTIFIER: print_node("IDENTIFIER", node->value, level, is_last); break;
case NODE_INT_LITERAL: print_node("INT_LITERAL", node->value, level, is_last); break;
case NODE_FLOAT_LITERAL: print_node("FLOAT_LITERAL", node->value, level, is_last); break;
case NODE_STRING_LITERAL: print_node("STRING_LITERAL", node->value, level, is_last); break;
case NODE_BOOL_LITERAL: print_node("BOOL_LITERAL", node->value, level, is_last); break;
case NODE_ARRAY_LITERAL: print_node("ARRAY_LITERAL", node->value, level, is_last); break;
case NODE_MAP_LITERAL: print_node("MAP_LITERAL", node->value, level, is_last); break;
case NODE_INDEX_EXPR: print_node("INDEX_EXPR", node->value, level, is_last); break;
case NODE_ANNOTATION: print_node("ANNOTATION", node->value, level, is_last); break;
case NODE_ANNOTATIONS: print_node("ANNOTATIONS", node->value, level, is_last); break;
case NODE_NAMED_ARG: print_node("NAMED_ARG", node->value, level, is_last); break;
case NODE_TRY_STMT: print_node("TRY_STMT", node->value, level, is_last); break;
case NODE_CATCH_BLOCK: print_node("CATCH_BLOCK", node->value, level, is_last); break;
case NODE_MAP_ENTRY: print_node("MAP_ENTRY", node->value, level, is_last); break;
case NODE_THROW_STMT: print_node("THROW_STMT", node->value, level, is_last); break;
case NODE_TYPE_IDENTIFIER: print_node("TYPE_IDENTIFIER", node->value, level, is_last); break;
case NODE_ELSE_IF: print_node("ELSE_IF", node->value, level, is_last); break;
case NODE_ELSE_BLOCK: print_node("ELSE_BLOCK", node->value, level, is_last); break;
case NODE_FOR_INIT: print_node("FOR_INIT", node->value, level, is_last); break;
case NODE_FOR_CONDITION: print_node("FOR_CONDITION", node->value, level, is_last); break;
case NODE_FOR_UPDATE: print_node("FOR_UPDATE", node->value, level, is_last); break;
case NODE_VAR_DECL_LIST: print_node("VAR_DECL_LIST", node->value, level, is_last); break;
case NODE_PARAM_LIST: print_node("PARAM_LIST", node->value, level, is_last); break;
case NODE_ARRAY_ITEM: print_node("ARRAY_ITEM", node->value, level, is_last); break;
case NODE_POS_ARG: print_node("POS_ARG", node->value, level, is_last); break;
case NODE_EMPTY_BLOCK: print_node("EMPTY_BLOCK", node->value, level, is_last); break;
case NODE_ERROR_NODE: print_node("ERROR_NODE", node->value, level, is_last); break;
case NODE_TYPE_GENERIC: print_node("TYPE_GENERIC", node->value, level, is_last); break;
case NODE_TYPE_UNION: print_node("TYPE_UNION", node->value, level, is_last); break;
case NODE_IMPORT_PATH: print_node("IMPORT_PATH", node->value, level, is_last); break;
case NODE_IMPORT_ALIAS: print_node("IMPORT_ALIAS", node->value, level, is_last); break;
case NODE_CAST_EXPR: print_node("CAST_EXPR", node->value, level, is_last); break;
case NODE_GENERIC_PARAMS: print_node("GENERIC_PARAMS", node->value, level, is_last); break;
case NODE_TERNARY_EXPR: print_node("TERNARY_EXPR", node->value, level, is_last); break;
case NODE_ARRAY_TYPE: print_node("ARRAY_TYPE", node->value, level, is_last); break;
default:
print_node("UNKNOWN_NODE", node->value, level, is_last);
break;
}
printf(COLOR_COMMENT " (%d:%d)" COLOR_RESET "\n", node->line, node->column);
for(int i = 0; i < node->children_count; i++) {
print_ast_recursive(node->children[i], level + 1, i == node->children_count - 1);
}
}
void ast_pretty_print(ASTNode *node) {
printf(COLOR_KEY "AST Tree:\n" COLOR_RESET);
print_ast_recursive(node, 0, 1);
}