summaryrefslogtreecommitdiffstats
path: root/src/com/craftinginterpreters/lox/Parser.java
diff options
context:
space:
mode:
authorGravatar Tom Willemse2020-11-18 18:18:25 -0800
committerGravatar Tom Willemse2020-11-18 18:18:25 -0800
commit8019f6aa414f5126ebbcd3afc44bcebc16855d5f (patch)
tree10e76f1ddcf8013f243f249fdbdf47c9568f4558 /src/com/craftinginterpreters/lox/Parser.java
parent055b5257fb6df2a0893c43ed342befd83d20af94 (diff)
downloadcrafting-interpreters-8019f6aa414f5126ebbcd3afc44bcebc16855d5f.tar.gz
crafting-interpreters-8019f6aa414f5126ebbcd3afc44bcebc16855d5f.zip
Chapter 8: Add expression and print statements
Diffstat (limited to 'src/com/craftinginterpreters/lox/Parser.java')
-rw-r--r--src/com/craftinginterpreters/lox/Parser.java32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/com/craftinginterpreters/lox/Parser.java b/src/com/craftinginterpreters/lox/Parser.java
index c5e50e0..c68316f 100644
--- a/src/com/craftinginterpreters/lox/Parser.java
+++ b/src/com/craftinginterpreters/lox/Parser.java
@@ -2,6 +2,7 @@ package com.craftinginterpreters.lox;
import static com.craftinginterpreters.lox.TokenType.*;
+import java.util.ArrayList;
import java.util.List;
class Parser {
@@ -15,18 +16,39 @@ class Parser {
this.tokens = tokens;
}
- public Expr parse() {
- try {
- return expression();
- } catch (ParseError error) {
- return null;
+ public List<Stmt> parse() {
+ List<Stmt> statements = new ArrayList<>();
+
+ while (!isAtEnd()) {
+ statements.add(statement());
}
+
+ return statements;
}
private Expr expression() {
return equality();
}
+ private Stmt statement() {
+ if (match(PRINT))
+ return printStatement();
+
+ return expressionStatement();
+ }
+
+ private Stmt printStatement() {
+ Expr value = expression();
+ consume(SEMICOLON, "Expect ';' after value.");
+ return new Stmt.Print(value);
+ }
+
+ private Stmt expressionStatement() {
+ Expr expr = expression();
+ consume(SEMICOLON, "Expect ';' after expression.");
+ return new Stmt.Expression(expr);
+ }
+
private Expr equality() {
Expr expr = comparison();