summaryrefslogtreecommitdiff
path: root/chapter05/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'chapter05/src/main/java')
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java1
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/Parser.java28
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();