diff --git a/examples/scala/Makefile b/examples/scala/Makefile index eacfbd28..a7e5c4b5 100644 --- a/examples/scala/Makefile +++ b/examples/scala/Makefile @@ -53,7 +53,7 @@ all : ${OUT}/GrammarParserBase.class ${OUT}/GrammarParser.class ${OUT}/SimplePar all : ${OUT}/test_coll_implicit.class ${OUT}/TestCollDriver.class all : ${OUT}/test_cycle_implicit.class ${OUT}/TestCycleDriver.class all : ${OUT}/test_use_coll_implicit.class ${OUT}/TestUseCollDriver.class -all : ${OUT}/grammar_implicit.class ${OUT}/GrammarDriver.class +all : ${OUT}/grammar_implicit.class ${OUT}/FirstDriver.class ${OUT}/FollowDriver.class ${OUT}/NullableDriver.class all : ${OUT}/FarrowLv_implicit.class ${OUT}/FarrowLvDriver.class all : ${OUT}/FarrowUbd_implicit.class ${OUT}/FarrowUbdDriver.class all : ${OUT}/FarrowUbdFiber_implicit.class ${OUT}/FarrowUbdFiberDriver.class @@ -301,8 +301,14 @@ ${OUT}/grammar_implicit.class : grammar.scala first${IMPL_SUFFIX} follow${IMPL_S ${SCALAC} ${SCALACFLAGS} $^ @touch $@ -${OUT}/GrammarDriver.class : ${OUT}/grammar_implicit.class ${OUT}/GrammarParser.class - ${SCALAC} ${SCALACFLAGS} grammar-driver.scala +${OUT}/FirstDriver.class : first-driver.scala ${OUT}/grammar_implicit.class ${OUT}/GrammarParser.class + ${SCALAC} ${SCALACFLAGS} first-driver.scala + +${OUT}/FollowDriver.class : follow-driver.scala ${OUT}/grammar_implicit.class ${OUT}/GrammarParser.class + ${SCALAC} ${SCALACFLAGS} follow-driver.scala + +${OUT}/NullableDriver.class : nullable-driver.scala ${OUT}/grammar_implicit.class ${OUT}/GrammarParser.class + ${SCALAC} ${SCALACFLAGS} nullable-driver.scala ${OUT}/TinyParser.class : tiny-parser.handcode.scala ${OUT}/tiny_implicit.class ${SCALAC} ${SCALACFLAGS} tiny-parser.handcode.scala diff --git a/examples/scala/README b/examples/scala/README index fa66cd23..e9605a1d 100644 --- a/examples/scala/README +++ b/examples/scala/README @@ -2,7 +2,9 @@ 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 ARGS="grammar.cfg" FirstDriver.run +make EVALUATOR=STATIC ARGS="grammar.cfg" FollowDriver.run +make EVALUATOR=STATIC ARGS="grammar.cfg" NullableDriver.run make EVALUATOR=STATIC ARGS="tiny.program" BroadFiberCycleDriver.run make EVALUATOR=STATIC ARGS="tiny.program" BelowFiberCycleDriver.run make EVALUATOR=STATIC ARGS="tiny.program" BelowSingleFiberCycleDriver.run diff --git a/examples/scala/compare-evaluators.sh b/examples/scala/compare-evaluators.sh index de1940b0..6ce39849 100755 --- a/examples/scala/compare-evaluators.sh +++ b/examples/scala/compare-evaluators.sh @@ -103,6 +103,9 @@ TESTS=( "NestedUbdDriver|nested-ubd.program" "NestedUbdFiberDriver|nested-ubd.program" "TestFieldsDriver|tiny.program" + "FirstDriver|grammar.cfg" + "FollowDriver|grammar.cfg" + "NullableDriver|grammar.cfg" ) failures=0 diff --git a/examples/scala/first-driver.scala b/examples/scala/first-driver.scala new file mode 100644 index 00000000..d4016ac0 --- /dev/null +++ b/examples/scala/first-driver.scala @@ -0,0 +1,28 @@ +object FirstDriver extends App { + + val symb = new M_SYMBOL("Symbol") + symb.finish() + + val ss = new GrammarScanner(new java.io.FileReader(args(0))) + val sp = new GrammarParser() + sp.reset(ss, args(0)) + if (!sp.yyparse()) { + println("Errors found.\n") + System.exit(1) + } + val grammarTree = sp.getTree() + + val grammar = grammarTree + val first = new M_FIRST[grammar.T_Result]("First", grammar.t_Result) + + grammar.finish() + first.finish() + + val results = first.v_firstTable.toSeq + .map { case (key, value) => (key.name, value.map(_.name).toSeq.sorted) } + .sortBy(_._1) + + println("Results:") + results + .foreach { case (key, value) => println(s"$key: ${value.mkString(", ")}") } +} \ No newline at end of file diff --git a/examples/scala/follow-driver.scala b/examples/scala/follow-driver.scala new file mode 100644 index 00000000..2f06a33d --- /dev/null +++ b/examples/scala/follow-driver.scala @@ -0,0 +1,28 @@ +object FollowDriver extends App { + + val symb = new M_SYMBOL("Symbol") + symb.finish() + + val ss = new GrammarScanner(new java.io.FileReader(args(0))) + val sp = new GrammarParser() + sp.reset(ss, args(0)) + if (!sp.yyparse()) { + println("Errors found.\n") + System.exit(1) + } + val grammarTree = sp.getTree() + + val grammar = grammarTree + val follow = new M_FOLLOW[grammar.T_Result]("Follow", grammar.t_Result) + + grammar.finish() + follow.finish() + + val results = follow.v_followTable.toSeq + .map { case (key, value) => (key.name, value.map(_.name).toSeq.sorted) } + .sortBy(_._1) + + println("Results:") + results + .foreach { case (key, value) => println(s"$key: ${value.mkString(", ")}") } +} \ No newline at end of file diff --git a/examples/scala/grammar-driver.scala b/examples/scala/grammar-driver.scala deleted file mode 100644 index c4185215..00000000 --- a/examples/scala/grammar-driver.scala +++ /dev/null @@ -1,28 +0,0 @@ -object GrammarDriver extends App { - - val symb = new M_SYMBOL("Symbol") - symb.finish() - - val ss = new GrammarScanner(new java.io.FileReader(args(0))); - val sp = new GrammarParser(); - sp.reset(ss, args(0)); - if (!sp.yyparse()) { - println("Errors found.\n"); - System.exit(1); - } - var grammar_tree = sp.getTree(); - val p = grammar_tree.t_Grammar; - - val m_grammar = grammar_tree; - val m_first = new M_FIRST[m_grammar.T_Result]("First", m_grammar.t_Result); - val m_follow = new M_FOLLOW[m_grammar.T_Result]("Follow", m_grammar.t_Result); - val m_nullable = new M_NULLABLE[m_grammar.T_Result]("Nullable", m_grammar.t_Result); - - Debug.activate(); - - m_grammar.finish(); - m_first.finish(); - m_follow.finish(); - m_nullable.finish(); - -} diff --git a/examples/scala/nullable-driver.scala b/examples/scala/nullable-driver.scala new file mode 100644 index 00000000..af5f8fc3 --- /dev/null +++ b/examples/scala/nullable-driver.scala @@ -0,0 +1,28 @@ +object NullableDriver extends App { + + val symb = new M_SYMBOL("Symbol") + symb.finish() + + val ss = new GrammarScanner(new java.io.FileReader(args(0))) + val sp = new GrammarParser() + sp.reset(ss, args(0)) + if (!sp.yyparse()) { + println("Errors found.\n") + System.exit(1) + } + val grammarTree = sp.getTree() + + val grammar = grammarTree + val nullable = new M_NULLABLE[grammar.T_Result]("Nullable", grammar.t_Result) + + grammar.finish() + nullable.finish() + + val results = nullable.v_nullableTable.toSeq + .map { case (key, value) => (key.name, value) } + .sortBy(_._1) + + println("Results:") + results + .foreach { case (key, value) => println(s"$key: $value") } +} \ No newline at end of file