diff --git a/src/colors.h b/src/colors.h new file mode 100644 index 0000000..128a9ed --- /dev/null +++ b/src/colors.h @@ -0,0 +1,11 @@ +#ifndef __COLORS_H +#define __COLORS_H + +#define COLOR_WHITE "\033[0m" +#define COLOR_BLUE "\033[94m" +#define COLOR_CYAN "\033[96m" +#define COLOR_GREEN "\033[92m" +#define COLOR_YELLOW "\033[93m" +#define COLOR_RED "\033[91m" + +#endif diff --git a/src/lexer.c b/src/lexer.c index 168e6ca..59e7c68 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -316,8 +316,6 @@ lexer_get_tokens (struct lexer *l) void lexer_print (struct lexer *l) { - puts ("Lexer:"); - for (unsigned int i = 0; i < l->tokens.length; i++) { struct token *t = l->tokens.elements[i]; diff --git a/src/main.c b/src/main.c index 46541fd..cd18b96 100644 --- a/src/main.c +++ b/src/main.c @@ -6,6 +6,8 @@ #include "lexer.h" #include "parser.h" +#include "colors.h" + int main (int argc, char **argv) { @@ -19,11 +21,24 @@ main (int argc, char **argv) if (!buffer_read (argv[1], &code)) return EXIT_FAILURE; + puts (COLOR_GREEN "\n********************************" COLOR_WHITE); + puts ("Source:"); + puts (COLOR_GREEN "********************************\n" COLOR_WHITE); + puts (buffer_get (&code)); + + puts (COLOR_GREEN "\n********************************" COLOR_WHITE); + puts ("Tokens:"); + puts (COLOR_GREEN "********************************\n" COLOR_WHITE); + struct lexer lexer = lexer_create (); lexer_set_source (&code, &lexer); lexer_lex (&lexer); lexer_print (&lexer); + puts (COLOR_GREEN "\n********************************" COLOR_WHITE); + puts ("AST:"); + puts (COLOR_GREEN "********************************\n" COLOR_WHITE); + struct parser parser = parser_create (lexer_get_tokens (&lexer)); parser_parse (&parser); parser_print (&parser); diff --git a/src/parser.c b/src/parser.c index 6bacaa7..334fe6d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -175,8 +175,11 @@ parser_parse (struct parser *p) } void -expr_print (struct expression *expr) +expr_print (struct expression *expr, unsigned int i) { + for (unsigned int j = 0; j < i; j++) + printf ("\t"); + switch (expr->type) { case EXPR_INT: @@ -186,20 +189,20 @@ expr_print (struct expression *expr) printf ("Float[%f]", expr->floating); break; case EXPR_BINOP: - printf ("BinOp('%s', ", buffer_get (&expr->binop.op->lexeme)); - expr_print (expr->binop.left); - printf (", "); - expr_print (expr->binop.right); + printf ("BinOp('%s',\n", buffer_get (&expr->binop.op->lexeme)); + expr_print (expr->binop.left, i + 1); + printf (",\n"); + expr_print (expr->binop.right, i + 1); printf (")"); break; case EXPR_UNOP: - printf ("UnOp('%s', ", buffer_get (&expr->unop.op->lexeme)); - expr_print (expr->unop.operand); + printf ("UnOp('%s',\n", buffer_get (&expr->unop.op->lexeme)); + expr_print (expr->unop.operand, i + 1); printf (")"); break; case EXPR_GROUP: - printf ("Grouping("); - expr_print (expr->grouping.value); + printf ("Grouping(\n"); + expr_print (expr->grouping.value, i + 1); printf (")"); break; default: @@ -211,11 +214,10 @@ expr_print (struct expression *expr) void parser_print (struct parser *p) { - puts ("Parsed Ast:"); for (unsigned int i = 0; i < vector_len (&p->ast); i++) { struct expression *expr = (struct expression *)vector_at (i, &p->ast); - expr_print (expr); + expr_print (expr, 0); printf ("\n"); } }