diff options
author | Tom Willemse | 2020-11-18 23:30:46 -0800 |
---|---|---|
committer | Tom Willemse | 2020-11-18 23:30:46 -0800 |
commit | 899ecea236288b5ebc7795c204fdad59b3276002 (patch) | |
tree | 00d8cdfa98f265455060279e9c98c10279baf9a6 /src/com/craftinginterpreters/lox/Parser.java | |
parent | 8019f6aa414f5126ebbcd3afc44bcebc16855d5f (diff) | |
download | crafting-interpreters-899ecea236288b5ebc7795c204fdad59b3276002.tar.gz crafting-interpreters-899ecea236288b5ebc7795c204fdad59b3276002.zip |
Chapter 8: Add variable declarations
Diffstat (limited to 'src/com/craftinginterpreters/lox/Parser.java')
-rw-r--r-- | src/com/craftinginterpreters/lox/Parser.java | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/com/craftinginterpreters/lox/Parser.java b/src/com/craftinginterpreters/lox/Parser.java index c68316f..9a9c0e6 100644 --- a/src/com/craftinginterpreters/lox/Parser.java +++ b/src/com/craftinginterpreters/lox/Parser.java @@ -20,7 +20,7 @@ class Parser { List<Stmt> statements = new ArrayList<>(); while (!isAtEnd()) { - statements.add(statement()); + statements.add(declaration()); } return statements; @@ -30,6 +30,18 @@ class Parser { return equality(); } + private Stmt declaration() { + try { + if (match(VAR)) + return varDeclaration(); + + return statement(); + } catch (ParseError error) { + synchronize(); + return null; + } + } + private Stmt statement() { if (match(PRINT)) return printStatement(); @@ -43,6 +55,18 @@ class Parser { return new Stmt.Print(value); } + private Stmt varDeclaration() { + Token name = consume(IDENTIFIER, "Expect variable name."); + + Expr initializer = null; + if (match(EQUAL)) { + initializer = expression(); + } + + consume(SEMICOLON, "Expect ';' after variable declaration."); + return new Stmt.Var(name, initializer); + } + private Stmt expressionStatement() { Expr expr = expression(); consume(SEMICOLON, "Expect ';' after expression."); @@ -119,6 +143,10 @@ class Parser { return new Expr.Literal(previous().literal); } + if (match(IDENTIFIER)) { + return new Expr.Variable(previous()); + } + if (match(LEFT_PAREN)) { Expr expr = expression(); consume(RIGHT_PAREN, "Expect ')' after expression."); |