From c62b73a2477b9fa625285e9c2ca1e51c2bcb8024 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Thu, 14 Jan 2021 23:53:47 -0800 Subject: Add branching primitives --- src/com/craftinginterpreters/lox/Parser.java | 42 +++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'src/com/craftinginterpreters/lox/Parser.java') 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(); -- cgit v1.2.3-54-g00ecf