Fixed some bugs with the Scanner and Parser.
This commit is contained in:
@@ -137,12 +137,20 @@ Expr* Primary() {
|
||||
if (Match(1, LParen)) {
|
||||
free(expr);
|
||||
expr = Expression();
|
||||
if (!Check(RParen)) printf("Unbalcnace\n");
|
||||
|
||||
Expr* temp = calloc(1, sizeof(Expr));
|
||||
if (!Check(RParen)) printf("Unbalanced\n"); //Todo: something or another...
|
||||
//Consume(RParen, "Expect ')' after expression.");
|
||||
expr->type = GROUPING;
|
||||
temp->type = GROUPING;
|
||||
temp->expression.Grouping.expression = expr;
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
return expr;
|
||||
free(expr);
|
||||
printf("Failed to match Primary\n");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int Match(int count, ...) {
|
||||
@@ -190,13 +198,13 @@ void PrintExpressionTree(const Expr* tree) {
|
||||
PrintExpressionTree(tree->expression.Binary.left);
|
||||
PrintExpressionTree(tree->expression.Binary.right);
|
||||
printf("%s", tree->expression.Binary.op->lexeme);
|
||||
printf(")\n");
|
||||
printf(")");
|
||||
}
|
||||
else if (tree->type == UNARY) {
|
||||
printf("(");
|
||||
printf("%s", tree->expression.Unary.op->lexeme);
|
||||
PrintExpressionTree(tree->expression.Unary.right);
|
||||
printf(")\n");
|
||||
printf(")");
|
||||
}
|
||||
else if (tree->type == GROUPING) {
|
||||
PrintExpressionTree(tree->expression.Grouping.expression);
|
||||
@@ -210,13 +218,10 @@ void FreeExpressionTree(Expr* tree) {
|
||||
if (tree->type == BINARY) {
|
||||
FreeExpressionTree(tree->expression.Binary.left);
|
||||
FreeExpressionTree(tree->expression.Binary.right);
|
||||
//FreeToken(tree->expression.Binary.op);
|
||||
}
|
||||
else if (tree->type == UNARY) {
|
||||
FreeExpressionTree(tree->expression.Unary.right);
|
||||
//FreeToken(tree->expression.Unary.op);
|
||||
}
|
||||
//else if (tree->type == LITERAL) FreeToken(tree->expression.Literal.type);
|
||||
|
||||
free(tree);
|
||||
}
|
||||
@@ -105,13 +105,13 @@ void ScanToken(TokenList* tokens) {
|
||||
AddToTokenList(CreateToken(NULL, line, LParen), tokens);
|
||||
break;
|
||||
case ')':
|
||||
AddToTokenList(CreateToken(NULL, line, LParen), tokens);
|
||||
AddToTokenList(CreateToken(NULL, line, RParen), tokens);
|
||||
break;
|
||||
case '{':
|
||||
AddToTokenList(CreateToken(NULL, line, LParen), tokens);
|
||||
AddToTokenList(CreateToken(NULL, line, LBrace), tokens);
|
||||
break;
|
||||
case '}':
|
||||
AddToTokenList(CreateToken(NULL, line, RParen), tokens);
|
||||
AddToTokenList(CreateToken(NULL, line, RBrace), tokens);
|
||||
break;
|
||||
case ',':
|
||||
AddToTokenList(CreateToken(NULL, line, Comma), tokens);
|
||||
|
||||
Reference in New Issue
Block a user