summaryrefslogtreecommitdiff
path: root/chapter05/src/main/java/com
diff options
context:
space:
mode:
authorYichen Yan <oraluben@outlook.com>2023-11-01 22:08:30 +0800
committerDibyendu Majumdar <dibyendumajumdar@users.noreply.github.com>2023-11-01 18:56:50 +0000
commitd3ffe6f9a935888233283962ce077ec25a01bec9 (patch)
treed93ccfbdb034562d2fd17e4c2151cf5cddbe64e9 /chapter05/src/main/java/com
parent3cad2b3c0af2418d51bb1ee46b1e24c5b362ba63 (diff)
downloadSimple-d3ffe6f9a935888233283962ce077ec25a01bec9.tar.gz
Simple-d3ffe6f9a935888233283962ce077ec25a01bec9.zip
Bail out unclosed block (#25)
* Report unclosed block in parsing * Fix tests * Resolve comments and rebase onto chapter5 * Test `isEOF` after consume whitespaces
Diffstat (limited to 'chapter05/src/main/java/com')
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/Parser.java18
1 files changed, 13 insertions, 5 deletions
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/Parser.java b/chapter05/src/main/java/com/seaofnodes/simple/Parser.java
index 79b50672..a9bec582 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();
+ parseBlock(false);
return STOP;
}
finally {
@@ -111,14 +111,22 @@ public class Parser {
* </pre>
* @return a {@link Node} or {@code null}
*/
- private Node parseBlock() {
+ private Node parseBlock(boolean requireClosingBracket) {
// Enter a new scope
_scope.push();
Node n = null;
- while (!match("}") && !_lexer.isEOF()) {
+ do {
+ if (match("}")) {
+ if (requireClosingBracket) break;
+ else throw error("unexpected '}' token");
+ } else if (_lexer.isEOF()) {
+ if (requireClosingBracket) require("}");
+ else break;
+ }
+
Node n0 = parseStatement();
if (n0 != null) n = n0; // Allow null returns from eg showGraph
- }
+ } while (true);
// Exit scope
_scope.pop();
return n;
@@ -135,7 +143,7 @@ public class Parser {
private Node parseStatement() {
if (matchx("return") ) return parseReturn();
else if (matchx("int")) return parseDecl();
- else if (match ("{" )) return parseBlock();
+ else if (match ("{" )) return parseBlock(true);
else if (matchx("if" )) return parseIf();
else if (matchx("#showGraph")) return require(showGraph(),";");
else return parseExpressionStatement();