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.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();