summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chapter13/src/main/java/com/seaofnodes/simple/Parser.java3
-rw-r--r--chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java4
-rw-r--r--chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java8
-rw-r--r--chapter13/src/test/java/com/seaofnodes/simple/Chapter12Test.java19
4 files changed, 27 insertions, 7 deletions
diff --git a/chapter13/src/main/java/com/seaofnodes/simple/Parser.java b/chapter13/src/main/java/com/seaofnodes/simple/Parser.java
index 56c8e955..bde697d6 100644
--- a/chapter13/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter13/src/main/java/com/seaofnodes/simple/Parser.java
@@ -195,7 +195,8 @@ public class Parser {
private Node parseStruct() {
if (_xScopes.size() > 1) throw errorSyntax("struct declarations can only appear in top level scope");
String typeName = requireId();
- if ( TYPES.containsKey(typeName)) throw errorSyntax("struct '" + typeName + "' cannot be redefined");
+ Type t = TYPES.get(typeName);
+ if( t!=null && !(t instanceof TypeStruct ts && ts._fields==null) ) throw errorSyntax("struct '" + typeName + "' cannot be redefined");
ArrayList<Field> fields = new ArrayList<>();
require("{");
while (!peek('}') && !_lexer.isEOF()) {
diff --git a/chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index e235cc36..0c5d72e5 100644
--- a/chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -24,8 +24,8 @@ public class LoadNode extends MemOpNode {
_declaredType = glb;
}
- @Override
- public String label() { return "."+_name; }
+ @Override public String label() { return _name; }
+ @Override public String glabel() { return "."+_name; }
@Override
StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(".").append(_name); }
diff --git a/chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java
index 2b4a46dd..89141892 100644
--- a/chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java
+++ b/chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java
@@ -21,10 +21,10 @@ public class StoreNode extends MemOpNode {
super(name, alias, memSlice, memPtr, value);
}
- @Override
- public String label() { return "."+_name+"="; }
- @Override
- public boolean isMem() { return true; }
+ @Override public String label() { return "ST"+_name; }
+ @Override public String glabel() { return "." +_name+"="; }
+ @Override public boolean isMem() { return true; }
+
public Node val() { return in(3); }
@Override
diff --git a/chapter13/src/test/java/com/seaofnodes/simple/Chapter12Test.java b/chapter13/src/test/java/com/seaofnodes/simple/Chapter12Test.java
index 903fe676..e36c7577 100644
--- a/chapter13/src/test/java/com/seaofnodes/simple/Chapter12Test.java
+++ b/chapter13/src/test/java/com/seaofnodes/simple/Chapter12Test.java
@@ -102,4 +102,23 @@ return next.i;
assertEquals("Stop[ return 0; return 1; return .i; ]", stop.toString());
assertEquals(2L, Evaluator.evaluate(stop, 3));
}
+
+ @Test
+ public void testCoRecur() {
+ Parser parser = new Parser(
+"""
+struct int0 { int i; flt0? f; }
+struct flt0 { flt f; int0? i; }
+int0 i0 = new int0;
+i0.i = 17;
+flt0 f0 = new flt0;
+f0.f = 3.14;
+i0.f = f0;
+f0.i = i0;
+return f0.i.f.i.i;
+""");
+ StopNode stop = parser.parse(false).iterate(false);
+ assertEquals("return 17;", stop.toString());
+ }
+
}