summaryrefslogtreecommitdiff
path: root/chapter13/src/main/java/com
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-09-04 08:14:23 -0700
committerThalia Archibald <thalia@archibald.dev>2024-09-07 10:54:48 -0700
commit29db69cb40c2fda992a704a50e9159a1a3e23ac9 (patch)
treee614204f3312a05c26ef1726251929c465903b7c /chapter13/src/main/java/com
parentfb0315e1d8911534c6ce5a4d3a8b63a2005d6fe5 (diff)
downloadSimple-29db69cb40c2fda992a704a50e9159a1a3e23ac9.tar.gz
Simple-29db69cb40c2fda992a704a50e9159a1a3e23ac9.zip
Backport empty statement fix
Split Ch13 tests from Chapter12Test.java Handle forward refs never defined.
Diffstat (limited to 'chapter13/src/main/java/com')
-rw-r--r--chapter13/src/main/java/com/seaofnodes/simple/Parser.java8
1 files changed, 5 insertions, 3 deletions
diff --git a/chapter13/src/main/java/com/seaofnodes/simple/Parser.java b/chapter13/src/main/java/com/seaofnodes/simple/Parser.java
index fee5215e..f04bf5c3 100644
--- a/chapter13/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter13/src/main/java/com/seaofnodes/simple/Parser.java
@@ -167,6 +167,7 @@ public class Parser {
else if (matchx("continue")) return parseContinue();
else if (matchx("struct") ) return parseStruct();
else if (matchx("#showGraph")) return require(showGraph(),";");
+ else if (matchx(";") ) return null; // Empty statement
// declarations of vars with struct type are handled in parseExpressionStatement due
// to ambiguity
else return parseExpressionStatement();
@@ -190,7 +191,7 @@ public class Parser {
* Only allowed in top level scope.
* Structs cannot be redefined.
*
- * @return The statement following the struct
+ * @return null
*/
private Node parseStruct() {
if (_xScopes.size() > 1) throw errorSyntax("struct declarations can only appear in top level scope");
@@ -209,7 +210,7 @@ public class Parser {
TypeStruct ts = TypeStruct.make(typeName, fields);
TYPES.put(typeName, ts);
START.addMemProj(ts, _scope); // Insert memory edges
- return parseStatement();
+ return null;
}
/**
@@ -579,7 +580,8 @@ public class Parser {
if( matchx("new") ) {
String structName = requireId();
Type t = TYPES.get(structName);
- if( t == null || !(t instanceof TypeStruct obj) ) throw errorSyntax("Unknown struct type '" + structName + "'");
+ if( !(t instanceof TypeStruct obj) || obj._fields==null )
+ throw error("Unknown struct type '" + structName + "'");
return newStruct(obj);
}
String name = _lexer.matchId();