diff options
| author | Cliff Click <cliffc@acm.org> | 2024-09-04 08:14:23 -0700 |
|---|---|---|
| committer | Thalia Archibald <thalia@archibald.dev> | 2024-09-07 10:54:48 -0700 |
| commit | 29db69cb40c2fda992a704a50e9159a1a3e23ac9 (patch) | |
| tree | e614204f3312a05c26ef1726251929c465903b7c /chapter13/src/main | |
| parent | fb0315e1d8911534c6ce5a4d3a8b63a2005d6fe5 (diff) | |
| download | Simple-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')
| -rw-r--r-- | chapter13/src/main/java/com/seaofnodes/simple/Parser.java | 8 |
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(); |
