From e657633aca9d1672cf2a1b202637bc414003855e Mon Sep 17 00:00:00 2001 From: Amir Hesamian Date: Fri, 19 Jun 2026 02:01:34 +0000 Subject: [PATCH 1/7] Tiny parser + scanner being used + complete tiny drivers --- examples/scala/Makefile | 50 ++++++++++++++++--- examples/scala/README | 12 +++++ examples/scala/below-fiber-cycle-driver.scala | 24 +++++++++ .../below-single-fiber-cycle-driver.scala | 24 +++++++++ examples/scala/broad-fiber-cycle-driver.scala | 11 ++-- examples/scala/local-fiber-cycle-driver.scala | 24 +++++++++ examples/scala/test-coll-driver.scala | 11 ++-- examples/scala/test-cycle-driver.scala | 11 ++-- examples/scala/test-use-coll-driver.scala | 11 ++-- examples/scala/tiny.program | 1 + examples/scala/use-global-driver.scala | 24 +++++---- 11 files changed, 173 insertions(+), 30 deletions(-) create mode 100644 examples/scala/below-fiber-cycle-driver.scala create mode 100644 examples/scala/below-single-fiber-cycle-driver.scala create mode 100644 examples/scala/local-fiber-cycle-driver.scala create mode 100644 examples/scala/tiny.program diff --git a/examples/scala/Makefile b/examples/scala/Makefile index 76770ec1..d5030fed 100644 --- a/examples/scala/Makefile +++ b/examples/scala/Makefile @@ -22,11 +22,14 @@ IMPL_SUFFIX = .scala endif SCALAGEN = simple.scala classic-binding.scala tiny.scala broad-fiber-cycle.scala \ + below-fiber-cycle.scala below-single-fiber-cycle.scala local-fiber-cycle.scala \ test-coll.scala test-use-coll.scala test-cycle.scala use-global.scala \ grammar.scala first.scala follow.scala nullable.scala \ farrow-lv-tree.scala farrow-lv.static.scala \ farrow-ubd-tree.scala farrow-ubd.static.scala farrow-ubd-fiber.static.scala \ - broad-fiber-cycle.static.scala classic-binding.static.scala \ + broad-fiber-cycle.static.scala below-fiber-cycle.static.scala \ + below-single-fiber-cycle.static.scala local-fiber-cycle.static.scala \ + classic-binding.static.scala \ grammar.scala first.static.scala follow.static.scala nullable.static.scala \ nested-cycles.static.scala \ test-coll.static.scala test-use-coll.static.scala test-cycle.static.scala use-global.static.scala @@ -57,6 +60,9 @@ all : NestedUbd_implicit.class NestedUbdDriver.class all : NestedUbdFiber_implicit.class NestedUbdFiberDriver.class all : nested_cycles_implicit.class NestedCyclesDriver.class all : broad_fiber_cycle_implicit.class BroadFiberCycleDriver.class +all : below_fiber_cycle_implicit.class BelowFiberCycleDriver.class +all : below_single_fiber_cycle_implicit.class BelowSingleFiberCycleDriver.class +all : local_fiber_cycle_implicit.class LocalFiberCycleDriver.class .PHONY: run @@ -271,17 +277,17 @@ test_use_coll_implicit.class : test-use-coll${IMPL_SUFFIX} ${SCALAC} ${SCALACFLAGS} $< @touch $@ -TestCollDriver.class : test_coll_implicit.class test-coll-driver.scala +TestCollDriver.class : test_coll_implicit.class TinyParser.class test-coll-driver.scala ${SCALAC} ${SCALACFLAGS} test-coll-driver.scala -TestUseCollDriver.class : test_use_coll_implicit.class test-use-coll-driver.scala tiny_implicit.class +TestUseCollDriver.class : test_use_coll_implicit.class TinyParser.class test-use-coll-driver.scala tiny_implicit.class ${SCALAC} ${SCALACFLAGS} test-use-coll-driver.scala test_cycle_implicit.class : test-cycle${IMPL_SUFFIX} ${SCALAC} ${SCALACFLAGS} $< @touch $@ -TestCycleDriver.class : test_cycle_implicit.class test-cycle-driver.scala +TestCycleDriver.class : test_cycle_implicit.class TinyParser.class test-cycle-driver.scala ${SCALAC} ${SCALACFLAGS} test-cycle-driver.scala grammar_implicit.class : grammar.scala first${IMPL_SUFFIX} follow${IMPL_SUFFIX} nullable${IMPL_SUFFIX} @@ -291,8 +297,11 @@ grammar_implicit.class : grammar.scala first${IMPL_SUFFIX} follow${IMPL_SUFFIX} GrammarDriver.class : grammar_implicit.class GrammarParser.class ${SCALAC} ${SCALACFLAGS} grammar-driver.scala -TinyParser.class : tiny-parser.handcode.scala tiny_implicit.class - ${SCALAC} ${SCALACFLAGS} tiny-parser.handcode.scala +TinyScanner.class : TinyScanner.scala + ${SCALAC} ${SCALACFLAGS} $< + +TinyParser.class : TinyParser.scala TinyScanner.class tiny_implicit.class + ${SCALAC} ${SCALACFLAGS} $< use_global_implicit.class : use-global${IMPL_SUFFIX} tiny_implicit.class ${SCALAC} ${SCALACFLAGS} $< @@ -307,10 +316,37 @@ broad_fiber_cycle_implicit.class : broad-fiber-cycle${IMPL_SUFFIX} ${SCALAC} ${SCALACFLAGS} $< @touch $@ -BroadFiberCycleDriver.class : broad_fiber_cycle_implicit.class tiny_implicit.class +BroadFiberCycleDriver.class : broad_fiber_cycle_implicit.class tiny_implicit.class TinyParser.class BroadFiberCycleDriver.class : broad-fiber-cycle-driver.scala ${SCALAC} ${SCALACFLAGS} $< +below_fiber_cycle_implicit.class : tiny_implicit.class +below_fiber_cycle_implicit.class : below-fiber-cycle${IMPL_SUFFIX} + ${SCALAC} ${SCALACFLAGS} $< + @touch $@ + +BelowFiberCycleDriver.class : below_fiber_cycle_implicit.class tiny_implicit.class TinyParser.class +BelowFiberCycleDriver.class : below-fiber-cycle-driver.scala + ${SCALAC} ${SCALACFLAGS} $< + +below_single_fiber_cycle_implicit.class : tiny_implicit.class +below_single_fiber_cycle_implicit.class : below-single-fiber-cycle${IMPL_SUFFIX} + ${SCALAC} ${SCALACFLAGS} $< + @touch $@ + +BelowSingleFiberCycleDriver.class : below_single_fiber_cycle_implicit.class tiny_implicit.class TinyParser.class +BelowSingleFiberCycleDriver.class : below-single-fiber-cycle-driver.scala + ${SCALAC} ${SCALACFLAGS} $< + +local_fiber_cycle_implicit.class : tiny_implicit.class +local_fiber_cycle_implicit.class : local-fiber-cycle${IMPL_SUFFIX} + ${SCALAC} ${SCALACFLAGS} $< + @touch $@ + +LocalFiberCycleDriver.class : local_fiber_cycle_implicit.class tiny_implicit.class TinyParser.class +LocalFiberCycleDriver.class : local-fiber-cycle-driver.scala + ${SCALAC} ${SCALACFLAGS} $< + .PHONY: %.run %.run : %.class diff --git a/examples/scala/README b/examples/scala/README index 5eee9d50..1eeb71f2 100644 --- a/examples/scala/README +++ b/examples/scala/README @@ -4,9 +4,21 @@ make EVALUATOR=STATIC ARGS="farrow-ubd.program" FarrowUbdDriver.run make EVALUATOR=STATIC ARGS="farrow-ubd.program" FarrowUbdFiberDriver.run make EVALUATOR=STATIC ARGS="grammar.cfg" GrammarDriver.run make EVALUATOR=STATIC BroadFiberCycleDriver.run +make EVALUATOR=STATIC ARGS="tiny.program" BroadFiberCycleDriver.run +make EVALUATOR=STATIC BelowFiberCycleDriver.run +make EVALUATOR=STATIC ARGS="tiny.program" BelowFiberCycleDriver.run +make EVALUATOR=STATIC BelowSingleFiberCycleDriver.run +make EVALUATOR=STATIC ARGS="tiny.program" BelowSingleFiberCycleDriver.run +make EVALUATOR=STATIC LocalFiberCycleDriver.run +make EVALUATOR=STATIC ARGS="tiny.program" LocalFiberCycleDriver.run make EVALUATOR=STATIC Classic.run make EVALUATOR=STATIC TestCollDriver.run +make EVALUATOR=STATIC ARGS="tiny.program" TestCollDriver.run make EVALUATOR=STATIC TestUseCollDriver.run +make EVALUATOR=STATIC ARGS="tiny.program" TestUseCollDriver.run +make EVALUATOR=STATIC TestCycleDriver.run +make EVALUATOR=STATIC ARGS="tiny.program" TestCycleDriver.run +make EVALUATOR=STATIC ARGS="tiny.program" UseGlobal.run make EVALUATOR=STATIC NestedCyclesDriver.run make EVALUATOR=STATIC ARGS="nested-ubd.program" NestedUbdDriver.run make EVALUATOR=STATIC ARGS="nested-ubd.program" NestedUbdFiberDriver.run diff --git a/examples/scala/below-fiber-cycle-driver.scala b/examples/scala/below-fiber-cycle-driver.scala new file mode 100644 index 00000000..8e493c25 --- /dev/null +++ b/examples/scala/below-fiber-cycle-driver.scala @@ -0,0 +1,24 @@ +object BelowFiberCycleDriver extends App +{ + val m = new M_TINY("Tiny"); + val t_Tiny = m.t_Result; + val p = new TinyParser(m); + + val w = if (args.length > 0) { + p.parseFile(args(0)) + } else { + t_Tiny.f_root(t_Tiny.f_branch(t_Tiny.f_leaf(3),t_Tiny.f_leaf(4))) + }; + + if (args.contains("--debug")) Debug.activate(); + + m.finish(); + + val m2 = new M_BELOW_FIBER_CYCLE("Test below",m); + val w2 = w.asInstanceOf[m2.T_Root]; + + m2.finish(); + + println("Results:"); + println("answer is " + m2.v_answer); +} diff --git a/examples/scala/below-single-fiber-cycle-driver.scala b/examples/scala/below-single-fiber-cycle-driver.scala new file mode 100644 index 00000000..331e8a92 --- /dev/null +++ b/examples/scala/below-single-fiber-cycle-driver.scala @@ -0,0 +1,24 @@ +object BelowSingleFiberCycleDriver extends App +{ + val m = new M_TINY("Tiny"); + val t_Tiny = m.t_Result; + val p = new TinyParser(m); + + val w = if (args.length > 0) { + p.parseFile(args(0)) + } else { + t_Tiny.f_root(t_Tiny.f_branch(t_Tiny.f_leaf(3),t_Tiny.f_leaf(4))) + }; + + if (args.contains("--debug")) Debug.activate(); + + m.finish(); + + val m2 = new M_BELOW_SINGLE_FIBER_CYCLE("Test below single",m); + val w2 = w.asInstanceOf[m2.T_Root]; + + m2.finish(); + + println("Results:"); + println("answer is " + m2.v_answer); +} diff --git a/examples/scala/broad-fiber-cycle-driver.scala b/examples/scala/broad-fiber-cycle-driver.scala index 2e224ff2..c3937239 100644 --- a/examples/scala/broad-fiber-cycle-driver.scala +++ b/examples/scala/broad-fiber-cycle-driver.scala @@ -1,12 +1,16 @@ object BroadFiberCycleDriver extends App { val m = new M_TINY("Tiny"); - type T_Tiny = m.T_Result; val t_Tiny = m.t_Result; + val p = new TinyParser(m); - val w = t_Tiny.v_root(t_Tiny.v_branch(t_Tiny.v_leaf(3),t_Tiny.v_leaf(4))); + val w = if (args.length > 0) { + p.parseFile(args(0)) + } else { + t_Tiny.f_root(t_Tiny.f_branch(t_Tiny.f_leaf(3),t_Tiny.f_leaf(4))) + }; - Debug.activate(); + if (args.contains("--debug")) Debug.activate(); m.finish(); @@ -15,5 +19,6 @@ object BroadFiberCycleDriver extends App m2.finish(); + println("Results:"); println("answer is " + m2.v_answer); } diff --git a/examples/scala/local-fiber-cycle-driver.scala b/examples/scala/local-fiber-cycle-driver.scala new file mode 100644 index 00000000..825b546c --- /dev/null +++ b/examples/scala/local-fiber-cycle-driver.scala @@ -0,0 +1,24 @@ +object LocalFiberCycleDriver extends App +{ + val m = new M_TINY("Tiny"); + val t_Tiny = m.t_Result; + val p = new TinyParser(m); + + val w = if (args.length > 0) { + p.parseFile(args(0)) + } else { + t_Tiny.f_root(t_Tiny.f_branch(t_Tiny.f_leaf(3),t_Tiny.f_leaf(4))) + }; + + if (args.contains("--debug")) Debug.activate(); + + m.finish(); + + val m2 = new M_LOCAL_FIBER_CYCLE("Test local",m); + val w2 = w.asInstanceOf[m2.T_Root]; + + m2.finish(); + + println("Results:"); + println("answer is " + m2.v_answer); +} diff --git a/examples/scala/test-coll-driver.scala b/examples/scala/test-coll-driver.scala index 8f0156cc..0ac0bdc2 100644 --- a/examples/scala/test-coll-driver.scala +++ b/examples/scala/test-coll-driver.scala @@ -1,12 +1,16 @@ object TestCollDriver extends App { val m = new M_TINY("Tiny"); - type T_Tiny = m.T_Result; val t_Tiny = m.t_Result; + val p = new TinyParser(m); - val w = t_Tiny.v_root(t_Tiny.v_branch(t_Tiny.v_leaf(3),t_Tiny.v_leaf(4))); + val w = if (args.length > 0) { + p.parseFile(args(0)) + } else { + t_Tiny.f_root(t_Tiny.f_branch(t_Tiny.f_leaf(3),t_Tiny.f_leaf(4))) + }; - Debug.activate(); + if (args.contains("--debug")) Debug.activate(); m.finish(); @@ -15,6 +19,7 @@ object TestCollDriver extends App m2.finish(); + println("Results:"); println("sum is " + m2.v_sum); println("leaves is " + m2.v_leaves); println("result is " + m2.v_result(w2)); diff --git a/examples/scala/test-cycle-driver.scala b/examples/scala/test-cycle-driver.scala index 739bdfc7..01a4cfc6 100644 --- a/examples/scala/test-cycle-driver.scala +++ b/examples/scala/test-cycle-driver.scala @@ -1,12 +1,16 @@ object TestCycleDriver extends App { val m = new M_TINY("Tiny"); - type T_Tiny = m.T_Result; val t_Tiny = m.t_Result; + val p = new TinyParser(m); - val w = t_Tiny.v_branch(t_Tiny.v_leaf(3),t_Tiny.v_leaf(4)); + val w = if (args.length > 0) { + p.parseFile(args(0)) + } else { + t_Tiny.f_root(t_Tiny.f_branch(t_Tiny.f_leaf(3),t_Tiny.f_leaf(4))) + }; - Debug.activate(); + if (args.contains("--debug")) Debug.activate(); m.finish(); @@ -15,5 +19,6 @@ object TestCycleDriver extends App m2.finish(); + println("Results:"); println("leaves is " + m2.v_leaves); } diff --git a/examples/scala/test-use-coll-driver.scala b/examples/scala/test-use-coll-driver.scala index c502123b..3c5b0ed4 100644 --- a/examples/scala/test-use-coll-driver.scala +++ b/examples/scala/test-use-coll-driver.scala @@ -1,12 +1,16 @@ object TestUseCollDriver extends App { val m = new M_TINY("Tiny"); - type T_Tiny = m.T_Result; val t_Tiny = m.t_Result; + val p = new TinyParser(m); - val w = t_Tiny.v_root(t_Tiny.v_branch(t_Tiny.v_leaf(3),t_Tiny.v_leaf(4))); + val w = if (args.length > 0) { + p.parseFile(args(0)) + } else { + t_Tiny.f_root(t_Tiny.f_branch(t_Tiny.f_leaf(3),t_Tiny.f_leaf(4))) + }; - Debug.activate(); + if (args.contains("--debug")) Debug.activate(); m.finish(); @@ -15,6 +19,7 @@ object TestUseCollDriver extends App m2.finish(); + println("Results:"); println("sum is " + m2.v_sum); println("leaves is " + m2.v_leaves); println("result is " + m2.v_result(w2)); diff --git a/examples/scala/tiny.program b/examples/scala/tiny.program new file mode 100644 index 00000000..d5dd2c8c --- /dev/null +++ b/examples/scala/tiny.program @@ -0,0 +1 @@ +1+(2+3)+4 diff --git a/examples/scala/use-global-driver.scala b/examples/scala/use-global-driver.scala index 4055b652..89cd629b 100644 --- a/examples/scala/use-global-driver.scala +++ b/examples/scala/use-global-driver.scala @@ -2,24 +2,26 @@ object UseGlobal { def main(args : Array[String]) : Unit = { if (args.length == 0) { - doWith("3,(1,4)") + println("Usage: UseGlobal "); + System.exit(1); } else { - for (arg <- args) { - doWith(arg) + val debug = args.contains("--debug"); + for (arg <- args if arg != "--debug") { + doWithFile(arg, debug) }; } - }; - def doWith(s : String) : Unit = { - val t = new M_TINY("Tiny"); + def doWithFile(filename : String, debug : Boolean) : Unit = { + val t = new M_TINY("Tiny"); val p = new TinyParser(t); - val m = new M_USE_GLOBAL("UseGlobal",t); - val r = p.asRoot(s).asInstanceOf[m.t_Result.T_Root]; + val r = p.parseFile(filename); t.finish(); - Debug.activate(); + val m = new M_USE_GLOBAL("UseGlobal",t); + val r2 = r.asInstanceOf[m.t_Result.T_Root]; + if (debug) Debug.activate(); m.finish(); - val t_Tiny = m.t_Result; - println("done is " + m.v_done(r)); + println("Results:"); + println("done is " + m.v_done(r2)); }; } From b3db3d18514a43e2353ad3622a65670df4130a41 Mon Sep 17 00:00:00 2001 From: Amir Hesamian Date: Fri, 19 Jun 2026 02:26:33 +0000 Subject: [PATCH 2/7] Updated the REAME --- examples/scala/README | 7 ------- 1 file changed, 7 deletions(-) diff --git a/examples/scala/README b/examples/scala/README index 1eeb71f2..5283dbf3 100644 --- a/examples/scala/README +++ b/examples/scala/README @@ -3,20 +3,13 @@ make EVALUATOR=STATIC ARGS="farrow-lv.program" FarrowLvDriver.run make EVALUATOR=STATIC ARGS="farrow-ubd.program" FarrowUbdDriver.run make EVALUATOR=STATIC ARGS="farrow-ubd.program" FarrowUbdFiberDriver.run make EVALUATOR=STATIC ARGS="grammar.cfg" GrammarDriver.run -make EVALUATOR=STATIC BroadFiberCycleDriver.run make EVALUATOR=STATIC ARGS="tiny.program" BroadFiberCycleDriver.run -make EVALUATOR=STATIC BelowFiberCycleDriver.run make EVALUATOR=STATIC ARGS="tiny.program" BelowFiberCycleDriver.run -make EVALUATOR=STATIC BelowSingleFiberCycleDriver.run make EVALUATOR=STATIC ARGS="tiny.program" BelowSingleFiberCycleDriver.run -make EVALUATOR=STATIC LocalFiberCycleDriver.run make EVALUATOR=STATIC ARGS="tiny.program" LocalFiberCycleDriver.run make EVALUATOR=STATIC Classic.run -make EVALUATOR=STATIC TestCollDriver.run make EVALUATOR=STATIC ARGS="tiny.program" TestCollDriver.run -make EVALUATOR=STATIC TestUseCollDriver.run make EVALUATOR=STATIC ARGS="tiny.program" TestUseCollDriver.run -make EVALUATOR=STATIC TestCycleDriver.run make EVALUATOR=STATIC ARGS="tiny.program" TestCycleDriver.run make EVALUATOR=STATIC ARGS="tiny.program" UseGlobal.run make EVALUATOR=STATIC NestedCyclesDriver.run From 290b21151c45a7cef89335f0f7132166b4fa80bb Mon Sep 17 00:00:00 2001 From: Amir Hesamian Date: Fri, 19 Jun 2026 03:56:15 +0000 Subject: [PATCH 3/7] Typo in drivers fixed --- examples/scala/below-fiber-cycle-driver.scala | 2 +- examples/scala/below-single-fiber-cycle-driver.scala | 2 +- examples/scala/broad-fiber-cycle-driver.scala | 2 +- examples/scala/local-fiber-cycle-driver.scala | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/scala/below-fiber-cycle-driver.scala b/examples/scala/below-fiber-cycle-driver.scala index 8e493c25..d0dbe3f8 100644 --- a/examples/scala/below-fiber-cycle-driver.scala +++ b/examples/scala/below-fiber-cycle-driver.scala @@ -20,5 +20,5 @@ object BelowFiberCycleDriver extends App m2.finish(); println("Results:"); - println("answer is " + m2.v_answer); + println("answer is " + m2.v_answer(w2)); } diff --git a/examples/scala/below-single-fiber-cycle-driver.scala b/examples/scala/below-single-fiber-cycle-driver.scala index 331e8a92..93af83ec 100644 --- a/examples/scala/below-single-fiber-cycle-driver.scala +++ b/examples/scala/below-single-fiber-cycle-driver.scala @@ -20,5 +20,5 @@ object BelowSingleFiberCycleDriver extends App m2.finish(); println("Results:"); - println("answer is " + m2.v_answer); + println("answer is " + m2.v_answer(w2)); } diff --git a/examples/scala/broad-fiber-cycle-driver.scala b/examples/scala/broad-fiber-cycle-driver.scala index c3937239..61ec09c2 100644 --- a/examples/scala/broad-fiber-cycle-driver.scala +++ b/examples/scala/broad-fiber-cycle-driver.scala @@ -20,5 +20,5 @@ object BroadFiberCycleDriver extends App m2.finish(); println("Results:"); - println("answer is " + m2.v_answer); + println("answer is " + m2.v_answer(w2)); } diff --git a/examples/scala/local-fiber-cycle-driver.scala b/examples/scala/local-fiber-cycle-driver.scala index 825b546c..9f6d5294 100644 --- a/examples/scala/local-fiber-cycle-driver.scala +++ b/examples/scala/local-fiber-cycle-driver.scala @@ -20,5 +20,5 @@ object LocalFiberCycleDriver extends App m2.finish(); println("Results:"); - println("answer is " + m2.v_answer); + println("answer is " + m2.v_answer(w2)); } From 88e5c1b5877479ffe403a852e62f1d126bd4f28f Mon Sep 17 00:00:00 2001 From: Amir Hesamian Date: Fri, 19 Jun 2026 04:27:28 +0000 Subject: [PATCH 4/7] Fixed Makefile issue --- examples/scala/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/scala/Makefile b/examples/scala/Makefile index d5030fed..9cab14e8 100644 --- a/examples/scala/Makefile +++ b/examples/scala/Makefile @@ -273,7 +273,7 @@ test_coll_implicit.class : test-coll${IMPL_SUFFIX} tiny_implicit.class ${SCALAC} ${SCALACFLAGS} $< @touch $@ -test_use_coll_implicit.class : test-use-coll${IMPL_SUFFIX} +test_use_coll_implicit.class : test-use-coll${IMPL_SUFFIX} tiny_implicit.class ${SCALAC} ${SCALACFLAGS} $< @touch $@ @@ -283,7 +283,7 @@ TestCollDriver.class : test_coll_implicit.class TinyParser.class test-coll-drive TestUseCollDriver.class : test_use_coll_implicit.class TinyParser.class test-use-coll-driver.scala tiny_implicit.class ${SCALAC} ${SCALACFLAGS} test-use-coll-driver.scala -test_cycle_implicit.class : test-cycle${IMPL_SUFFIX} +test_cycle_implicit.class : test-cycle${IMPL_SUFFIX} tiny_implicit.class ${SCALAC} ${SCALACFLAGS} $< @touch $@ From 81e5403c36626e733daaddbc87b1db1f9b4f9e76 Mon Sep 17 00:00:00 2001 From: Amir Hesamian Date: Fri, 19 Jun 2026 13:09:53 +0000 Subject: [PATCH 5/7] Running all tests and making sure their diff match --- .github/workflows/test.yml | 15 +++ examples/scala/compare-evaluators.sh | 124 ++++++++++++++++++++++ examples/scala/test-coll-driver.scala | 2 +- examples/scala/test-cycle-driver.scala | 2 +- examples/scala/test-use-coll-driver.scala | 2 +- examples/test-cycle.aps | 3 +- 6 files changed, 144 insertions(+), 4 deletions(-) create mode 100755 examples/scala/compare-evaluators.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 30664327..aa36810e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,6 +15,8 @@ jobs: env: SCALA_VERSION: "2.13.12" SCALA_MAJOR: "2.13" + JFLEX_URL: "https://github.com/boyland/JFlex/releases/download/v1.5+scala.1/JFlex.jar" + SCALA_BISON_URL: "https://github.com/boyland/scala-bison/releases/download/v1.2/scala-bison-2.13.jar" steps: - name: Checkout code @@ -53,6 +55,13 @@ jobs: cd utilities/tests make all + - name: Download JFlex and scala-bison + run: | + mkdir -p "$HOME/git/scala-bison" + mkdir -p "$HOME/Documents/Courses/sp26-cs654/etc" + wget -q -O "$HOME/git/scala-bison/scala-bison-2.13.jar" "$SCALA_BISON_URL" + wget -q -O "$HOME/Documents/Courses/sp26-cs654/etc/JFlex.jar" "$JFLEX_URL" + - name: Run examples Scala tests run: | cd examples/scala/tests @@ -63,6 +72,12 @@ jobs: cd examples ../bin/aps2scala -DCOTo -G -p .:../base test-canonicals + - name: Run compare-evaluators + if: github.event_name == 'push' + run: | + cd examples/scala + ./compare-evaluators.sh + - name: Clean up if: always() run: make clean diff --git a/examples/scala/compare-evaluators.sh b/examples/scala/compare-evaluators.sh new file mode 100755 index 00000000..41120bd3 --- /dev/null +++ b/examples/scala/compare-evaluators.sh @@ -0,0 +1,124 @@ +#!/bin/bash + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +EVALUATORS=(DYNAMIC STATIC) + +extract_results() { + sed -n '/^Results:$/,$p' +} + +run_with_evaluator() { + local evaluator="$1" + local driver="$2" + local args="$3" + local outfile="$4" + + rm -f *_implicit.class "${driver}.class" + if ! make EVALUATOR="$evaluator" "$driver.class" > /dev/null 2>&1; then + return 1 + fi + make EVALUATOR="$evaluator" ARGS="$args" "$driver.run" 2>&1 | extract_results > "$outfile" +} + +run_driver() { + local driver="$1" + shift + local args="$*" + local pass=true + local build_failed=false + local tmpdir + tmpdir=$(mktemp -d) + + echo "--- $driver ${args:+(${args})} ---" + + local built_evaluators=() + for eval in "${EVALUATORS[@]}"; do + echo " running $eval ..." + if ! run_with_evaluator "$eval" "$driver" "$args" "$tmpdir/$eval"; then + echo " FAIL: $eval build failed" + build_failed=true + continue + fi + if [ ! -s "$tmpdir/$eval" ]; then + echo " WARNING: $eval produced no Results: output" + pass=false + continue + fi + built_evaluators+=("$eval") + done + + if $build_failed; then + rm -rf "$tmpdir" + return 1 + fi + + local n=${#built_evaluators[@]} + if [ $n -lt 2 ]; then + echo " FAIL: fewer than 2 evaluators built successfully" + rm -rf "$tmpdir" + return 1 + fi + + for ((i=0; i /dev/null 2>&1; then + echo " PASS ($e1 == $e2)" + else + echo " FAIL ($e1 != $e2)" + diff "$tmpdir/$e1" "$tmpdir/$e2" | sed 's/^/ /' + pass=false + fi + done + done + + rm -rf "$tmpdir" + $pass +} + +if [ $# -gt 0 ]; then + driver="$1" + shift + run_driver "$driver" "$@" + exit $? +fi + +TESTS=( + "BroadFiberCycleDriver|tiny.program" + "BelowFiberCycleDriver|tiny.program" + "BelowSingleFiberCycleDriver|tiny.program" + "LocalFiberCycleDriver|tiny.program" + "TestCollDriver|tiny.program" + "TestUseCollDriver|tiny.program" + "TestCycleDriver|tiny.program" + "UseGlobal|tiny.program" + "FarrowUbdDriver|farrow-ubd.program" + "FarrowUbdFiberDriver|farrow-ubd.program" + "NestedUbdDriver|nested-ubd.program" + "NestedUbdFiberDriver|nested-ubd.program" +) + +failures=0 +total=0 + +for test in "${TESTS[@]}"; do + IFS="|" read -r driver args <<< "$test" + total=$((total + 1)) + return_code=0 + run_driver "$driver" "$args" || return_code=$? + if [ $return_code -eq 1 ]; then + failures=$((failures + 1)) + fi + echo "" +done + +echo "==============================" +echo "$((total - failures))/$total passed" +if [ $failures -gt 0 ]; then + echo "$failures FAILED" + exit 1 +fi +echo "All passed!" diff --git a/examples/scala/test-coll-driver.scala b/examples/scala/test-coll-driver.scala index 0ac0bdc2..fd9ae59f 100644 --- a/examples/scala/test-coll-driver.scala +++ b/examples/scala/test-coll-driver.scala @@ -21,6 +21,6 @@ object TestCollDriver extends App println("Results:"); println("sum is " + m2.v_sum); - println("leaves is " + m2.v_leaves); + println("leaves is " + m2.v_leaves.toSeq.sorted); println("result is " + m2.v_result(w2)); } diff --git a/examples/scala/test-cycle-driver.scala b/examples/scala/test-cycle-driver.scala index 01a4cfc6..dcf75064 100644 --- a/examples/scala/test-cycle-driver.scala +++ b/examples/scala/test-cycle-driver.scala @@ -20,5 +20,5 @@ object TestCycleDriver extends App m2.finish(); println("Results:"); - println("leaves is " + m2.v_leaves); + println("leaves is " + m2.v_leaves.toSeq.sorted); } diff --git a/examples/scala/test-use-coll-driver.scala b/examples/scala/test-use-coll-driver.scala index 3c5b0ed4..1aef95cc 100644 --- a/examples/scala/test-use-coll-driver.scala +++ b/examples/scala/test-use-coll-driver.scala @@ -21,6 +21,6 @@ object TestUseCollDriver extends App println("Results:"); println("sum is " + m2.v_sum); - println("leaves is " + m2.v_leaves); + println("leaves is " + m2.v_leaves.toSeq.sorted); println("result is " + m2.v_result(w2)); } diff --git a/examples/test-cycle.aps b/examples/test-cycle.aps index 7533f63b..0edbdd20 100644 --- a/examples/test-cycle.aps +++ b/examples/test-cycle.aps @@ -8,13 +8,14 @@ module TEST_CYCLE[T :: var TINY[]] extends T begin circular attribute Wood.partial : IntegerLattice; pragma synthesized(partial); - match root(?) begin + match ?r=root(?w) begin end; match ?l=leaf(?x) begin l.partial := (leaves \ x) \/ {x+1} ; leaves :> {x-1}; end; + match ?b=branch(?x,?y) begin b.partial := x.partial \/ y.partial; leaves :> x.partial; From 07146655510579833e0194a7fe8592eaae5f48c0 Mon Sep 17 00:00:00 2001 From: Amir Hesamian Date: Fri, 19 Jun 2026 18:10:21 +0000 Subject: [PATCH 6/7] Amir's custom parser was being used instead of Prof. Boyland's --- examples/scala/Makefile | 7 ++----- examples/scala/tiny-parser.handcode.scala | 9 +++++++++ examples/scala/tiny.program | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/examples/scala/Makefile b/examples/scala/Makefile index 9cab14e8..0a81a683 100644 --- a/examples/scala/Makefile +++ b/examples/scala/Makefile @@ -297,11 +297,8 @@ grammar_implicit.class : grammar.scala first${IMPL_SUFFIX} follow${IMPL_SUFFIX} GrammarDriver.class : grammar_implicit.class GrammarParser.class ${SCALAC} ${SCALACFLAGS} grammar-driver.scala -TinyScanner.class : TinyScanner.scala - ${SCALAC} ${SCALACFLAGS} $< - -TinyParser.class : TinyParser.scala TinyScanner.class tiny_implicit.class - ${SCALAC} ${SCALACFLAGS} $< +TinyParser.class : tiny-parser.handcode.scala tiny_implicit.class + ${SCALAC} ${SCALACFLAGS} tiny-parser.handcode.scala use_global_implicit.class : use-global${IMPL_SUFFIX} tiny_implicit.class ${SCALAC} ${SCALACFLAGS} $< diff --git a/examples/scala/tiny-parser.handcode.scala b/examples/scala/tiny-parser.handcode.scala index 5e1bd1ff..b2cd488c 100644 --- a/examples/scala/tiny-parser.handcode.scala +++ b/examples/scala/tiny-parser.handcode.scala @@ -13,6 +13,15 @@ class TinyParser(m_tree : M_TINY) { parseRoot(tok) }; + def parseFile(filename : String) : t_Tree.T_Root = { + val source = scala.io.Source.fromFile(filename) + try { + asRoot(source.mkString.trim) + } finally { + source.close() + } + }; + def parseRoot(t : StringTokenizer) : t_Tree.T_Root = t_Tree.f_root(parseWood(t)); diff --git a/examples/scala/tiny.program b/examples/scala/tiny.program index d5dd2c8c..7ab6fc30 100644 --- a/examples/scala/tiny.program +++ b/examples/scala/tiny.program @@ -1 +1 @@ -1+(2+3)+4 +1,(2,3),4 From 83e91b301252e234402dd34251d1edfbc4ba8cf0 Mon Sep 17 00:00:00 2001 From: Amir Hesamian Date: Fri, 19 Jun 2026 18:18:13 +0000 Subject: [PATCH 7/7] nicer use-global-driver --- examples/scala/use-global-driver.scala | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/examples/scala/use-global-driver.scala b/examples/scala/use-global-driver.scala index 89cd629b..44ea17ee 100644 --- a/examples/scala/use-global-driver.scala +++ b/examples/scala/use-global-driver.scala @@ -1,17 +1,29 @@ object UseGlobal { def main(args : Array[String]) : Unit = { - if (args.length == 0) { - println("Usage: UseGlobal "); - System.exit(1); + val debug = args.contains("--debug"); + val files = args.filter(_ != "--debug") + if (files.isEmpty) { + doWith("3,(1,4)", debug) } else { - val debug = args.contains("--debug"); - for (arg <- args if arg != "--debug") { + for (arg <- files) { doWithFile(arg, debug) }; } }; + def doWith(s : String, debug : Boolean) : Unit = { + val t = new M_TINY("Tiny"); + val p = new TinyParser(t); + val m = new M_USE_GLOBAL("UseGlobal",t); + val r = p.asRoot(s).asInstanceOf[m.t_Result.T_Root]; + t.finish(); + if (debug) Debug.activate(); + m.finish(); + println("Results:"); + println("done is " + m.v_done(r)); + }; + def doWithFile(filename : String, debug : Boolean) : Unit = { val t = new M_TINY("Tiny"); val p = new TinyParser(t);