Skip to content

Commit 786476f

Browse files
authored
Update parser.c
1 parent 8057112 commit 786476f

File tree

1 file changed

+39
-5
lines changed

1 file changed

+39
-5
lines changed

parser.c

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,20 @@ static bool match(TokenType type) {
5353
return false;
5454
}
5555

56-
static Expr* expression();
57-
static Stmt* statement();
58-
static Stmt* declaration();
59-
static Expr* unary();
56+
static Expr* expression() {
57+
return binary();
58+
}
59+
60+
static Expr* unary() {
61+
if (match(TOKEN_MINUS) {
62+
Expr* expr = malloc(sizeof(Expr));
63+
expr->type = EXPR_UNARY;
64+
expr->unary.op = parser.previous;
65+
expr->unary.right = unary();
66+
return expr;
67+
}
68+
return primary();
69+
}
6070

6171
static Expr* binary() {
6272
Expr* expr = unary();
@@ -89,11 +99,35 @@ static Expr* binary() {
8999
}
90100
}
91101

92-
static Stmt* parse_statement() {
102+
static Stmt* print_statement() {
103+
Expr* expr = expression();
104+
consume(TOKEN_SEMICOLON, "Expect ';' after value.");
105+
106+
Stmt* stmt = malloc(sizeof(Stmt));
107+
stmt->type = STMT_PRINT;
108+
stmt->print.expr = expr;
109+
return stmt;
110+
}
111+
112+
static Stmt* expression_statement() {
113+
Expr* expr = expression();
114+
consume(TOKEN_SEMICOLON, "Expect ';' after expression.");
115+
116+
Stmt* stmt = malloc(sizeof(Stmt));
117+
stmt->type = STMT_EXPRESSION;
118+
stmt->expression.expr = expr;
119+
return stmt;
120+
}
121+
122+
static Stmt* statement() {
93123
if (match(TOKEN_PRINT)) return print_statement();
94124
return expression_statement();
95125
}
96126

127+
static Stmt* declaration() {
128+
return statement();
129+
}
130+
97131
void init_parser() {
98132
parser.had_error = false;
99133
parser.panic_mode = false;

0 commit comments

Comments
 (0)