summaryrefslogtreecommitdiffstats
path: root/src/com/craftinginterpreters/lox/Parser.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/craftinginterpreters/lox/Parser.java')
-rw-r--r--src/com/craftinginterpreters/lox/Parser.java42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/com/craftinginterpreters/lox/Parser.java b/src/com/craftinginterpreters/lox/Parser.java
index f044feb..1643129 100644
--- a/src/com/craftinginterpreters/lox/Parser.java
+++ b/src/com/craftinginterpreters/lox/Parser.java
@@ -43,6 +43,8 @@ class Parser {
}
private Stmt statement() {
+ if (match(IF))
+ return ifStatement();
if (match(PRINT))
return printStatement();
if (match(LEFT_BRACE))
@@ -51,6 +53,20 @@ class Parser {
return expressionStatement();
}
+ private Stmt ifStatement() {
+ consume(LEFT_PAREN, "Expect '(' after 'if'.");
+ Expr condition = expression();
+ consume(RIGHT_PAREN, "Expect ')' after if condition.");
+
+ Stmt thenBranch = statement();
+ Stmt elseBranch = null;
+ if (match(ELSE)) {
+ elseBranch = statement();
+ }
+
+ return new Stmt.If(condition, thenBranch, elseBranch);
+ }
+
private Stmt printStatement() {
Expr value = expression();
consume(SEMICOLON, "Expect ';' after value.");
@@ -87,7 +103,7 @@ class Parser {
}
private Expr assignment() {
- Expr expr = equality();
+ Expr expr = or();
if (match(EQUAL)) {
Token equals = previous();
@@ -104,6 +120,30 @@ class Parser {
return expr;
}
+ private Expr or() {
+ Expr expr = and();
+
+ while (match(OR)) {
+ Token operator = previous();
+ Expr right = and();
+ expr = new Expr.Logical(expr, operator, right);
+ }
+
+ return expr;
+ }
+
+ private Expr and() {
+ Expr expr = equality();
+
+ while (match(AND)) {
+ Token operator = previous();
+ Expr right = equality();
+ expr = new Expr.Logical(expr, operator, right);
+ }
+
+ return expr;
+ }
+
private Expr equality() {
Expr expr = comparison();