diff --git a/lox.c b/lox.c index 993b11e..ac02ef8 100644 --- a/lox.c +++ b/lox.c @@ -39,7 +39,9 @@ void RunFile(const char* path) { TokenList* tokens = ScanTokens(contents); free(contents); Print(tokens); + printf("TREE:\n"); Expr* tree = GenerateExpressionTree(tokens); + PrintExpressionTree(tree); FreeExpressionTree(tree); DestroyTokenList(tokens); } diff --git a/parser.c b/parser.c index 03ee3b1..9b6ea7e 100644 --- a/parser.c +++ b/parser.c @@ -1,4 +1,6 @@ #include "parser.h" +#include "expr.h" +#include Expr* Expression(void); Expr* Equality(void); @@ -135,9 +137,9 @@ Expr* Primary() { if (Match(1, LParen)) { free(expr); expr = Expression(); + if (!Check(RParen)) printf("Unbalcnace\n"); //Consume(RParen, "Expect ')' after expression."); expr->type = GROUPING; - return expr; } return expr; @@ -181,7 +183,25 @@ Token* AdvanceParser() { } void PrintExpressionTree(const Expr* tree) { - + if (!tree) return; + + if (tree->type == BINARY) { + printf("("); + PrintExpressionTree(tree->expression.Binary.left); + PrintExpressionTree(tree->expression.Binary.right); + printf("%s", tree->expression.Binary.op->lexeme); + printf(")\n"); + } + else if (tree->type == UNARY) { + printf("("); + printf("%s", tree->expression.Unary.op->lexeme); + PrintExpressionTree(tree->expression.Unary.right); + printf(")\n"); + } + else if (tree->type == GROUPING) { + PrintExpressionTree(tree->expression.Grouping.expression); + } + else if (tree->type == LITERAL) printf("%s", tree->expression.Literal.type->lexeme); } void FreeExpressionTree(Expr* tree) {