--- a/lex_blex_Frankensteined.scala Thu May 07 11:36:15 2020 +0100
+++ b/lex_blex_Frankensteined.scala Wed May 27 22:23:52 2020 +0100
@@ -1,9 +1,13 @@
-package RexpRelated
+
+import Element.elem
import scala.language.implicitConversions
import scala.language.reflectiveCalls
import scala.annotation.tailrec
import scala.util.Try
+
+package RexpRelated
+{
abstract class Bit
case object Z extends Bit
case object S extends Bit
@@ -31,6 +35,10 @@
def AALT(bs: Bits, r1: ARexp, r2: ARexp) = AALTS(bs, List(r1, r2))
+
+
+
+
def distinctBy[B, C](xs: List[B], f: B => C, acc: List[C] = Nil): List[B] = xs match {
case Nil => Nil
case (x::xs) => {
@@ -661,6 +669,10 @@
case Sequ(v1small, v2small) => Sequ(vunsimp(r1, v1)(v1small), vunsimp(r2, v2)(v2small))
case _ => {
println(vsmall) ;
+ println(aregex_simple_print(r1))
+ println(v1)
+ println(aregex_simple_print( r2))
+ println(v2)
throw new Exception("bad arguments sequ")
}
//(ASEQ(bs1, r1s, r2s), Sequ(v1s, v2s))
@@ -828,11 +840,11 @@
}
def deunify(rs_length: Int, v: Val): Val = v match{
case Position(i, v0) => {
- if(i <0) {println(rs_length, v); throw new Exception("deunify minus")}
- else if(rs_length == 1) {println(v); v}
- else if(rs_length - 1 == i) coat(v0, i)
- else coat(Left(v0), i)
- }
+ if(i <0) {throw new Exception("deunify minus")}
+ else if(rs_length == 1) { v0}
+ else if(rs_length - 1 == i) {coat(v0, i)}
+ else {coat(Left(v0), i)}
+ }
case _ => throw new Exception("deunify error")
}
def flats2(front: List[ARexp], i: Int, rs: List[ARexp], v: Val): (List[ARexp], Val) = v match {
@@ -856,15 +868,16 @@
}
case _ => throw new Exception("flats2 error")
}
- def distinctBy2[B, C](v: Val, xs: List[B], f: B => C, acc: List[C] = Nil, res: List[B] = Nil): (List[B], Val) = xs match {
+ def distinctBy2[B, C](j: Int, v: Val, xs: List[B], f: B => C, acc: List[C] = Nil, res: List[B] = Nil): (List[B], Val) = xs match {
case Nil => (res, v)
case (x::xs) => {
val re = f(x)
if (acc.contains(re)) v match {
- case Position(i, v0) => distinctBy2(Position(i - 1, v0), xs, f, acc, res)
+ case Position(i, v0) => if(j > 0) distinctBy2(j - 1, Position(i - 1, v0), xs, f, acc, res)
+ else if(j < 0)distinctBy2(j - 1, Position(i, v0), xs, f, acc, res) else throw new Exception("Value not POSIX")
case _ => throw new Exception("dB2")
}
- else distinctBy2(v, xs, f, re::acc, x::res)
+ else distinctBy2(j - 1, v, xs, f, re::acc, x::res)
}
}
def bsimp2(r: ARexp, v: Val): (ARexp, Val) = (r,v) match{
@@ -875,14 +888,21 @@
case ((r1s, v1s), (r2s, v2s)) => (ASEQ(bs1, r1s, r2s), Sequ(v1s, v2s))
}
case (AALTS(bs1, rs), v) => {
+ println("Entry into AALTS")
+ rs.map(println(aregex_simple_print()))
val vlist = unify(rs, v)
vlist match {
case Position(i, v0) => {
val v_simp = bsimp2(rs(i), v0)._2
+ println("map on bsimp")
val rs_simp = rs.map(bsimp)
val flat_res = flats2( Nil, i, rs_simp, Position(i, v_simp) )
- val dist_res = distinctBy2(flat_res._2, flat_res._1, erase)
+ println("list after flats2")
+ flat_res._1.map(println(aregex_simple_print(_)))
+ val dist_res = distinctBy2(i, flat_res._2, flat_res._1, erase)
+ println("list after distinctBy2")
val rs_new = dist_res._1
+ rs_new.map(println(aregex_simple_print(_)))
val v_new = deunify(rs_new.length, dist_res._2)
rs_new match {
case Nil => (AZERO, undefined)
@@ -1283,7 +1303,48 @@
//--------------------------------------------------------------------------------------------------------END OF NON-BITCODE PART (TESTING)
+ def bstostick(bs: List[Bit]): Element = bs match {
+ //case b::Nil => elem(b.toString)
+ case b::bs1 => elem(b.toString) beside bstostick(bs1)
+ case Nil => elem(' ', 1, 1)
+ }
+ def aregex_simple_print(r: ARexp): Element = r match {
+ case AALTS(bs,rs) => {
+ val bitstick = bstostick(bs)
+ rs match {
+ case r::rs1 =>
+ rs1.foldLeft(
+ ((elem("(") left_align bitstick) beside
+ aregex_simple_print(r)) )( (acc, r2) => acc beside ((elem(" + ") above elem(" ")) beside aregex_simple_print(r2) )) beside
+ elem(")")
+ case Nil => elem(' ', 1, 1)
+ }
+ }
+ case ASEQ(bs, r1, r2) => {
+ ((elem("[") left_align bstostick(bs)) beside aregex_simple_print(r1) beside elem("~") beside aregex_simple_print(r2) beside (elem("]") above elem(" ")))
+ }
+ case ASTAR(bs, r) => {
+ r match {
+ case AONE(_) | AZERO | ACHAR(_, _) => {
+ (elem("{") left_align bstostick(bs)) beside (aregex_simple_print(r) beside elem("}*"))
+ }
+ case _ => {
+ (elem("{") left_align bstostick(bs)) beside (aregex_simple_print(r) beside elem("}*"))
+ }
+ }
+ }
+ case AONE(bs) => {
+ elem("1") left_align bstostick(bs)
+ }
+ case ACHAR(bs, c) => {
+ elem(c, 1, 1) left_align bstostick(bs)
+ }
+ case AZERO =>
+ {
+ elem ("0") above elem(" ")
+ }
+ }
def clear() = {
@@ -1345,6 +1406,8 @@
}
+
+
import Rexp.Bits
abstract class ARexp
case object AZERO extends ARexp
@@ -1368,3 +1431,4 @@
case object undefined extends Val
//case class Pos(i: Int, v: Val) extends Val
case object Prd extends Val
+}