From 688d2230b93b03f2d4505346ef3b89b0f4c46445 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Mon, 11 Nov 2024 09:55:48 -0800 Subject: Allow C-style for loops --- .../java/com/seaofnodes/simple/BrainFuckTest.java | 18 ++--- .../java/com/seaofnodes/simple/Chapter17Test.java | 93 ++++++++++++++++++---- 2 files changed, 83 insertions(+), 28 deletions(-) (limited to 'chapter17/src/test') diff --git a/chapter17/src/test/java/com/seaofnodes/simple/BrainFuckTest.java b/chapter17/src/test/java/com/seaofnodes/simple/BrainFuckTest.java index de6852c7..28c3477c 100644 --- a/chapter17/src/test/java/com/seaofnodes/simple/BrainFuckTest.java +++ b/chapter17/src/test/java/com/seaofnodes/simple/BrainFuckTest.java @@ -23,11 +23,11 @@ public class BrainFuckTest { Parser parser = new Parser( encoded + """ -var pc = 0, d = 0; +var d = 0; u8[] !output = new u8[0]; val data = new u8[100]; -while (pc < program#) { +for( int pc = 0; pc < program#; pc++ ) { var command = program[pc]; if (command == 62) { d++; @@ -40,16 +40,14 @@ while (pc < program#) { } else if (command == 46) { var old = output; output = new u8[output# + 1]; - var i = 0; - while (i < old#) - output[i] = old[i++]; - output[i] = data[d]; + for( var i = 0; i < old#; i++ ) + output[i] = old[i]; + output[old#] = data[d]; } else if (command == 44) { data[d] = 42; } else if (command == 91) { if (data[d] == 0) { - var d = 1; - while (d > 0) { + for( var d = 1; d > 0; ) { pc++; command = program[pc]; if (command == 91) d++; @@ -58,8 +56,7 @@ while (pc < program#) { } } else if (command == 93) { if (data[d]) { - var d = 1; - while (d > 0) { + for( var d = 1; d > 0; ) { pc--; command = program[pc]; if (command == 93) d++; @@ -67,7 +64,6 @@ while (pc < program#) { } } } - pc++; } return output; """); diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java index fe275ee9..d39cee2d 100644 --- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java +++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java @@ -2,7 +2,6 @@ package com.seaofnodes.simple; import com.seaofnodes.simple.evaluator.Evaluator; import com.seaofnodes.simple.node.StopNode; -import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @@ -162,6 +161,72 @@ return b ? b.next ? b.next.x : b.x; // parses "b ? (b.next ? b.next.x : b.x) : 0 } + @Test + public void testFor0() { + Parser parser = new Parser(""" +int sum=0; +for( int i=0; i=arg ) break; + sum = sum + i; +} +return sum; +"""); + StopNode stop = parser.parse().iterate(); + assertEquals("return Phi(Loop,0,(Phi_sum+Phi(Loop,0,(Phi_i+1))));", stop.toString()); + assertEquals(3L, Evaluator.evaluate(stop, 3)); + assertEquals(45L, Evaluator.evaluate(stop, 10)); + } + @Test + public void testFor3() { + Parser parser = new Parser(""" +int sum=0; +for( int i=0; i