diff options
| author | Cliff Click <cliffc@acm.org> | 2023-11-01 10:18:45 -0700 |
|---|---|---|
| committer | Dibyendu Majumdar <dibyendumajumdar@users.noreply.github.com> | 2023-11-01 18:56:50 +0000 |
| commit | 360f4d1f2b5b4a3cb8bd97f1a659e8f7a3d0669e (patch) | |
| tree | a8aa09539d7da67263d54d201cf4e7f58ab6863a /chapter05/src/main/java/com/seaofnodes | |
| parent | d3ffe6f9a935888233283962ce077ec25a01bec9 (diff) | |
| download | Simple-360f4d1f2b5b4a3cb8bd97f1a659e8f7a3d0669e.tar.gz Simple-360f4d1f2b5b4a3cb8bd97f1a659e8f7a3d0669e.zip | |
Cleanup PR#28.
Remove parseBlock flag, and just require the missing `}`
Diffstat (limited to 'chapter05/src/main/java/com/seaofnodes')
| -rw-r--r-- | chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java | 1 | ||||
| -rw-r--r-- | chapter05/src/main/java/com/seaofnodes/simple/Parser.java | 28 |
2 files changed, 14 insertions, 15 deletions
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java b/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java index 072d07b1..f3942edb 100644 --- a/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java +++ b/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java @@ -1,7 +1,6 @@ package com.seaofnodes.simple; import com.seaofnodes.simple.node.*; -import com.seaofnodes.simple.type.TypeControl; import java.util.*; diff --git a/chapter05/src/main/java/com/seaofnodes/simple/Parser.java b/chapter05/src/main/java/com/seaofnodes/simple/Parser.java index a9bec582..8bf343b3 100644 --- a/chapter05/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter05/src/main/java/com/seaofnodes/simple/Parser.java @@ -93,7 +93,7 @@ public class Parser { try { _scope.define(CTRL , new ProjNode(START, 0, CTRL ).peephole()); _scope.define("arg", new ProjNode(START, 1, "arg").peephole()); - parseBlock(false); + parseBlock(); return STOP; } finally { @@ -109,24 +109,17 @@ public class Parser { * <pre> * '{' statements '}' * </pre> + * Does not parse the opening or closing '{}' * @return a {@link Node} or {@code null} */ - private Node parseBlock(boolean requireClosingBracket) { + private Node parseBlock() { // Enter a new scope _scope.push(); Node n = null; - do { - if (match("}")) { - if (requireClosingBracket) break; - else throw error("unexpected '}' token"); - } else if (_lexer.isEOF()) { - if (requireClosingBracket) require("}"); - else break; - } - + while (!peek('}') && !_lexer.isEOF()) { Node n0 = parseStatement(); if (n0 != null) n = n0; // Allow null returns from eg showGraph - } while (true); + }; // Exit scope _scope.pop(); return n; @@ -143,7 +136,7 @@ public class Parser { private Node parseStatement() { if (matchx("return") ) return parseReturn(); else if (matchx("int")) return parseDecl(); - else if (match ("{" )) return parseBlock(true); + else if (match ("{" )) return require(parseBlock(),"}"); else if (matchx("if" )) return parseIf(); else if (matchx("#showGraph")) return require(showGraph(),";"); else return parseExpressionStatement(); @@ -360,8 +353,10 @@ public class Parser { // Return true and skip if "syntax" is next in the stream. private boolean match (String syntax) { return _lexer.match (syntax); } - // Match must not be followed by more id letters + // Match must be "exact", not be followed by more id letters private boolean matchx(String syntax) { return _lexer.matchx(syntax); } + // Return true and do NOT skip if 'ch' is next + private boolean peek(char ch) { return _lexer.peek(ch); } // Require and return an identifier private String requireId() { @@ -466,6 +461,11 @@ public class Parser { return false; } + private boolean peek(char ch) { + skipWhiteSpace(); + return peek()==ch; + } + // Return an identifier or null String matchId() { skipWhiteSpace(); |
