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