diff --git a/.cache-main b/.cache-main
new file mode 100644
index 0000000..0921b50
--- /dev/null
+++ b/.cache-main
@@ -0,0 +1,159 @@
+format version: 5
+output mode:
+1 items
+0 -> multiple
+output directories:
+1 items
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin
+compile options:
+10 items
+0 -> -javabootclasspath
+1 -> /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/System/Library/Java/Extensions/AppleScriptEngine.jar:/System/Library/Java/Extensions/dns_sd.jar:/System/Library/Java/Extensions/j3daudio.jar:/System/Library/Java/Extensions/j3dcore.jar:/System/Library/Java/Extensions/j3dutils.jar:/System/Library/Java/Extensions/jai_codec.jar:/System/Library/Java/Extensions/jai_core.jar:/System/Library/Java/Extensions/mlibwrapper_jai.jar:/System/Library/Java/Extensions/MRJToolkit.jar:/System/Library/Java/Extensions/vecmath.jar
+2 -> -javaextdirs
+3 ->
+4 -> -bootclasspath
+5 -> /Applications/ScaleIDE/plugins/org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar
+6 -> -deprecation
+7 -> -unchecked
+8 -> -encoding
+9 -> UTF-8
+javac options:
+0 items
+compiler version:
+1 items
+0 -> 2.11.7
+compile order:
+1 items
+0 -> Mixed
+name hashing:
+1 items
+0 -> false
+products:
+19 items
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Program$.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Program$delayedInit$body.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Program.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/RegexMatcher$.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/RegexMatcher.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Concat$.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Concat.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/EMPTY$.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/EMPTY.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/EPSILON$.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/EPSILON.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Literal$.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Literal.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/RegularExpression$.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/RegularExpression.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Star$.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Star.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Union$.class
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Union.class
+binary dependencies:
+6 items
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> /Applications/ScaleIDE/plugins/org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala -> /Applications/ScaleIDE/plugins/org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala -> /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Applications/ScaleIDE/plugins/org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar
+direct source dependencies:
+3 items
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> /Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala -> /Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> /Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala
+direct external dependencies:
+0 items
+public inherited source dependencies:
+0 items
+public inherited external dependencies:
+0 items
+member reference internal dependencies:
+0 items
+member reference external dependencies:
+0 items
+inheritance internal dependencies:
+0 items
+inheritance external dependencies:
+0 items
+class names:
+19 items
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> dsls.regex.Program
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> dsls.regex.Program$
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> dsls.regex.Program$delayedInit$body
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala -> dsls.regex.RegexMatcher
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala -> dsls.regex.RegexMatcher$
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.Concat
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.Concat$
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.EMPTY
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.EMPTY$
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.EPSILON
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.EPSILON$
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.Literal
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.Literal$
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.RegularExpression
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.RegularExpression$
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.Star
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.Star$
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.Union
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> dsls.regex.Union$
+used names:
+0 items
+product stamps:
+19 items
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Concat$.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Concat.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/EMPTY$.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/EMPTY.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/EPSILON$.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/EPSILON.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Literal$.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Literal.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Program$.class -> lastModified(1456176182000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Program$delayedInit$body.class -> lastModified(1456176182000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Program.class -> lastModified(1456176182000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/RegexMatcher$.class -> lastModified(1456176182000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/RegexMatcher.class -> lastModified(1456176182000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/RegularExpression$.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/RegularExpression.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Star$.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Star.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Union$.class -> lastModified(1456176440000)
+/Users/wchen/Desktop/DSL/regular-expressions/bin/dsls/regex/Union.class -> lastModified(1456176440000)
+source stamps:
+3 items
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala -> hash(3e76d55d3738836cc7063d272091a281f5f50d3b)
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala -> hash(8bb9e92a2b1239ee17dc4361242a8730b70076fb)
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala -> hash(1dbbac12b3f31de52e003a7ae8dc24889373fe8f)
+binary stamps:
+2 items
+/Applications/ScaleIDE/plugins/org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar -> lastModified(1449017844000)
+/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar -> lastModified(1438711540000)
+class names:
+2 items
+/Applications/ScaleIDE/plugins/org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar -> scala.Equals
+/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar -> java.io.Serializable
+internal apis:
+3 items
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala ->
+rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHCS7FQeAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAFzcgATeHNidGkuYXBpLkNsYXNzTGlrZYM0HKHfsJdsAgAETAAOZGVmaW5pdGlvblR5cGV0ABpMeHNidGkvYXBpL0RlZmluaXRpb25UeXBlO1sAEHNhdmVkQW5ub3RhdGlvbnN0ABNbTGphdmEvbGFuZy9TdHJpbmc7TAAIc2VsZlR5cGV0ABBMeHNidGkvYXBpL0xhenk7TAAJc3RydWN0dXJlcQB+ABV4cgAheHNidGkuYXBpLlBhcmFtZXRlcml6ZWREZWZpbml0aW9u+RFusdVQPOICAAFbAA50eXBlUGFyYW1ldGVyc3QAGltMeHNidGkvYXBpL1R5cGVQYXJhbWV0ZXI7eHIAFHhzYnRpLmFwaS5EZWZpbml0aW9uhyob6HFC40YCAARMAAZhY2Nlc3N0ABJMeHNidGkvYXBpL0FjY2VzcztbAAthbm5vdGF0aW9uc3QAF1tMeHNidGkvYXBpL0Fubm90YXRpb247TAAJbW9kaWZpZXJzdAAVTHhzYnRpL2FwaS9Nb2RpZmllcnM7TAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwc3IAEHhzYnRpLmFwaS5QdWJsaWO6WD2ubC1gQgIAAHhyABB4c2J0aS5hcGkuQWNjZXNz3WKa+B1jMUgCAAB4cHVyABdbTHhzYnRpLmFwaS5Bbm5vdGF0aW9uO+uX6xkQ9o1IAgAAeHAAAAAAc3IAE3hzYnRpLmFwaS5Nb2RpZmllcnPHERMhaZzcJAIAAUIABWZsYWdzeHAAdAASZHNscy5yZWdleC5Qcm9ncmFtdXIAGltMeHNidGkuYXBpLlR5cGVQYXJhbWV0ZXI72W0mDyid8rYCAAB4cAAAAAB+cgAYeHNidGkuYXBpLkRlZmluaXRpb25UeXBlAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAAGTW9kdWxldXIAE1tMamF2YS5sYW5nLlN0cmluZzut0lbn6R17RwIAAHhwAAAAAnQAEHNjYWxhLmRlcHJlY2F0ZWR0ABpzY2FsYS5kZXByZWNhdGVkT3ZlcnJpZGluZ3NyABN4c2J0aS5TYWZlTGF6eSRJbXBsO5FPEfRFTMkCAANaAAhiaXRtYXAkMEwAAl90dAASTGphdmEvbGFuZy9PYmplY3Q7TAAEZXZhbHQAEUxzY2FsYS9GdW5jdGlvbjA7eHIAFnhzYnRpLmFwaS5BYnN0cmFjdExhennTd7UBX7vnoAIAAHhwAHBzcgAgeHNidGkuU2FmZUxhenkkJGFub25mdW4kc3RyaWN0JDEAAAAAAAAAAAIAAUwAB3ZhbHVlJDFxAH4AMXhwc3IAE3hzYnRpLmFwaS5FbXB0eVR5cGW8/Z5GSTuJJAIAAHhyABR4c2J0aS5hcGkuU2ltcGxlVHlwZXJ4YoghI79AAgAAeHIADnhzYnRpLmFwaS5UeXBlP2rZIRZJqsoCAAB4cHNxAH4AMABwc3EAfgA1c3IAE3hzYnRpLmFwaS5TdHJ1Y3R1cmWpqvmAk2/YAAIAA0wACGRlY2xhcmVkcQB+ABVMAAlpbmhlcml0ZWRxAH4AFUwAB3BhcmVudHNxAH4AFXhxAH4AOXNxAH4AMABwc3EAfgA1dXEAfgAQAAAAAHNxAH4AMABwc3EAfgA1dXEAfgAQAAAAAXNyAA14c2J0aS5hcGkuRGVmUr6f4ny0NmkCAAJMAApyZXR1cm5UeXBldAAQTHhzYnRpL2FwaS9UeXBlO1sAD3ZhbHVlUGFyYW1ldGVyc3QAGltMeHNidGkvYXBpL1BhcmFtZXRlckxpc3Q7eHEAfgAWcQB+ACB1cQB+ACEAAAABc3IAFHhzYnRpLmFwaS5Bbm5vdGF0aW9u3g6BovZcCrICAAJbAAlhcmd1bWVudHN0AB9bTHhzYnRpL2FwaS9Bbm5vdGF0aW9uQXJndW1lbnQ7TAAEYmFzZXEAfgBGeHB1cgAfW0x4c2J0aS5hcGkuQW5ub3RhdGlvbkFyZ3VtZW50O1Gdpo84JQ94AgAAeHAAAAABc3IAHHhzYnRpLmFwaS5Bbm5vdGF0aW9uQXJndW1lbnTWRbHYAxsXfAIAAkwABG5hbWVxAH4AHEwABXZhbHVlcQB+ABx4cHQAAHQAKigibWFpbiBzaG91bGQgbm90IGJlIG92ZXJyaWRkZW4iLCIyLjExLjAiKXNyABR4c2J0aS5hcGkuUHJvamVjdGlvbvPSjVTpRaQtAgACTAACaWRxAH4AHEwABnByZWZpeHQAFkx4c2J0aS9hcGkvU2ltcGxlVHlwZTt4cQB+ADh0ABRkZXByZWNhdGVkT3ZlcnJpZGluZ3NyABN4c2J0aS5hcGkuU2luZ2xldG9u/Kdf+M9W5EYCAAFMAARwYXRodAAQTHhzYnRpL2FwaS9QYXRoO3hxAH4AOHNyAA54c2J0aS5hcGkuUGF0aJs9XAjOpSeEAgABWwAKY29tcG9uZW50c3QAGltMeHNidGkvYXBpL1BhdGhDb21wb25lbnQ7eHB1cgAaW0x4c2J0aS5hcGkuUGF0aENvbXBvbmVudDtD2gl0LWcWdAIAAHhwAAAAAnNyAAx4c2J0aS5hcGkuSWSYMmyLN1PEQAIAAUwAAmlkcQB+ABx4cgAXeHNidGkuYXBpLlBhdGhDb21wb25lbnRfmiJbLoafvAIAAHhwdAAFc2NhbGFzcgAOeHNidGkuYXBpLlRoaXPbCe2mzFpAXAIAAHhxAH4AYHNxAH4AIwB0AARtYWludXEAfgAmAAAAAHNxAH4AU3QABFVuaXRxAH4AWXVyABpbTHhzYnRpLmFwaS5QYXJhbWV0ZXJMaXN0O/XTOh3ys3DuAgAAeHAAAAABc3IAF3hzYnRpLmFwaS5QYXJhbWV0ZXJMaXN01sW8HGRJdOMCAAJaAAppc0ltcGxpY2l0WwAKcGFyYW1ldGVyc3QAHFtMeHNidGkvYXBpL01ldGhvZFBhcmFtZXRlcjt4cAB1cgAcW0x4c2J0aS5hcGkuTWV0aG9kUGFyYW1ldGVyO8+4xV2l3bVtAgAAeHAAAAABc3IAGXhzYnRpLmFwaS5NZXRob2RQYXJhbWV0ZXIfRa4X00mw6gIABFoACmhhc0RlZmF1bHRMAAhtb2RpZmllcnQAHUx4c2J0aS9hcGkvUGFyYW1ldGVyTW9kaWZpZXI7TAAEbmFtZXEAfgAcTAADdHBlcQB+AEZ4cAB+cgAbeHNidGkuYXBpLlBhcmFtZXRlck1vZGlmaWVyAAAAAAAAAAASAAB4cQB+ACl0AAVQbGFpbnQABGFyZ3NzcgAXeHNidGkuYXBpLlBhcmFtZXRlcml6ZWQWbO5pA8m7fwIAAkwACGJhc2VUeXBlcQB+AFRbAA10eXBlQXJndW1lbnRzdAARW0x4c2J0aS9hcGkvVHlwZTt4cQB+ADhzcQB+AFN0AAVBcnJheXEAfgBZdXIAEVtMeHNidGkuYXBpLlR5cGU7dP+lWnv56UECAAB4cAAAAAFzcQB+AFN0AAZTdHJpbmdzcQB+AFdzcQB+AFp1cQB+AF0AAAADc3EAfgBfdAAEamF2YXNxAH4AX3QABGxhbmdxAH4AZHNxAH4AMABwc3EAfgA1dXEAfgB9AAAABHNxAH4AU3QAA0FwcHEAfgBZc3EAfgBTdAALRGVsYXllZEluaXRxAH4AWXNxAH4AU3QABk9iamVjdHEAfgCBc3EAfgBTdAADQW55cQB+AFl1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAnNyABF4c2J0aS5hcGkuUGFja2FnZX5Zj/auzjlYAgABTAAEbmFtZXEAfgAceHB0AApkc2xzLnJlZ2V4c3EAfgCVdAAEZHNsc3NyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUwrdL6p1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAXNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5cQB+ABxMAA9zb3VyY2VEaXJlY3RvcnlxAH4AHHhwdAAwL1VzZXJzL3djaGVuL0Rlc2t0b3AvRFNML3JlZ3VsYXItZXhwcmVzc2lvbnMvYmludAA7L1VzZXJzL3djaGVuL0Rlc2t0b3AvRFNML3JlZ3VsYXItZXhwcmVzc2lvbnMvc3JjL21haW4vc2NhbGF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFD521V03OINsxwY9JyCRooH19Q07
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala ->
+rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHBZZIt5AHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAFzcgATeHNidGkuYXBpLkNsYXNzTGlrZYM0HKHfsJdsAgAETAAOZGVmaW5pdGlvblR5cGV0ABpMeHNidGkvYXBpL0RlZmluaXRpb25UeXBlO1sAEHNhdmVkQW5ub3RhdGlvbnN0ABNbTGphdmEvbGFuZy9TdHJpbmc7TAAIc2VsZlR5cGV0ABBMeHNidGkvYXBpL0xhenk7TAAJc3RydWN0dXJlcQB+ABV4cgAheHNidGkuYXBpLlBhcmFtZXRlcml6ZWREZWZpbml0aW9u+RFusdVQPOICAAFbAA50eXBlUGFyYW1ldGVyc3QAGltMeHNidGkvYXBpL1R5cGVQYXJhbWV0ZXI7eHIAFHhzYnRpLmFwaS5EZWZpbml0aW9uhyob6HFC40YCAARMAAZhY2Nlc3N0ABJMeHNidGkvYXBpL0FjY2VzcztbAAthbm5vdGF0aW9uc3QAF1tMeHNidGkvYXBpL0Fubm90YXRpb247TAAJbW9kaWZpZXJzdAAVTHhzYnRpL2FwaS9Nb2RpZmllcnM7TAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwc3IAEHhzYnRpLmFwaS5QdWJsaWO6WD2ubC1gQgIAAHhyABB4c2J0aS5hcGkuQWNjZXNz3WKa+B1jMUgCAAB4cHVyABdbTHhzYnRpLmFwaS5Bbm5vdGF0aW9uO+uX6xkQ9o1IAgAAeHAAAAAAc3IAE3hzYnRpLmFwaS5Nb2RpZmllcnPHERMhaZzcJAIAAUIABWZsYWdzeHAAdAAXZHNscy5yZWdleC5SZWdleE1hdGNoZXJ1cgAaW0x4c2J0aS5hcGkuVHlwZVBhcmFtZXRlcjvZbSYPKJ3ytgIAAHhwAAAAAH5yABh4c2J0aS5hcGkuRGVmaW5pdGlvblR5cGUAAAAAAAAAABIAAHhyAA5qYXZhLmxhbmcuRW51bQAAAAAAAAAAEgAAeHB0AAZNb2R1bGV1cgATW0xqYXZhLmxhbmcuU3RyaW5nO63SVufpHXtHAgAAeHAAAAAAc3IAE3hzYnRpLlNhZmVMYXp5JEltcGw7kU8R9EVMyQIAA1oACGJpdG1hcCQwTAACX3R0ABJMamF2YS9sYW5nL09iamVjdDtMAARldmFsdAARTHNjYWxhL0Z1bmN0aW9uMDt4cgAWeHNidGkuYXBpLkFic3RyYWN0TGF6edN3tQFfu+egAgAAeHABc3IAE3hzYnRpLmFwaS5FbXB0eVR5cGW8/Z5GSTuJJAIAAHhyABR4c2J0aS5hcGkuU2ltcGxlVHlwZXJ4YoghI79AAgAAeHIADnhzYnRpLmFwaS5UeXBlP2rZIRZJqsoCAAB4cHBzcQB+AC4Bc3IAE3hzYnRpLmFwaS5TdHJ1Y3R1cmWpqvmAk2/YAAIAA0wACGRlY2xhcmVkcQB+ABVMAAlpbmhlcml0ZWRxAH4AFUwAB3BhcmVudHNxAH4AFXhxAH4ANXNxAH4ALgF1cQB+ABAAAAAAcHNxAH4ALgF1cQB+ABAAAAAAcHNxAH4ALgF1cgARW0x4c2J0aS5hcGkuVHlwZTt0/6Vae/npQQIAAHhwAAAAAnNyABR4c2J0aS5hcGkuUHJvamVjdGlvbvPSjVTpRaQtAgACTAACaWRxAH4AHEwABnByZWZpeHQAFkx4c2J0aS9hcGkvU2ltcGxlVHlwZTt4cQB+ADR0AAZPYmplY3RzcgATeHNidGkuYXBpLlNpbmdsZXRvbvynX/jPVuRGAgABTAAEcGF0aHQAEEx4c2J0aS9hcGkvUGF0aDt4cQB+ADRzcgAOeHNidGkuYXBpLlBhdGibPVwIzqUnhAIAAVsACmNvbXBvbmVudHN0ABpbTHhzYnRpL2FwaS9QYXRoQ29tcG9uZW50O3hwdXIAGltMeHNidGkuYXBpLlBhdGhDb21wb25lbnQ7Q9oJdC1nFnQCAAB4cAAAAANzcgAMeHNidGkuYXBpLklkmDJsizdTxEACAAFMAAJpZHEAfgAceHIAF3hzYnRpLmFwaS5QYXRoQ29tcG9uZW50X5oiWy6Gn7wCAAB4cHQABGphdmFzcQB+AE10AARsYW5nc3IADnhzYnRpLmFwaS5UaGlz2wntpsxaQFwCAAB4cQB+AE5zcQB+AEF0AANBbnlzcQB+AEVzcQB+AEh1cQB+AEsAAAACc3EAfgBNdAAFc2NhbGFxAH4AVHBwdXIAFFtMeHNidGkuYXBpLlBhY2thZ2U7WxMZN3CnJ6ECAAB4cAAAAAJzcgAReHNidGkuYXBpLlBhY2thZ2V+WY/2rs45WAIAAUwABG5hbWVxAH4AHHhwdAAKZHNscy5yZWdleHNxAH4AXnQABGRzbHNzcgAVeHNidGkuYXBpLkNvbXBpbGF0aW9u7frgw2rooEICAAJKAAlzdGFydFRpbWVbAAdvdXRwdXRzdAAaW0x4c2J0aS9hcGkvT3V0cHV0U2V0dGluZzt4cAAAAVMK3S+qdXIAGltMeHNidGkuYXBpLk91dHB1dFNldHRpbmc7f2rC86eHpUICAAB4cAAAAAFzcgAXeHNidGkuYXBpLk91dHB1dFNldHRpbmd62ZpHdPsdewIAAkwAD291dHB1dERpcmVjdG9yeXEAfgAcTAAPc291cmNlRGlyZWN0b3J5cQB+ABx4cHQAMC9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL2JpbnQAOy9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL3NyYy9tYWluL3NjYWxhdXIAAltCrPMX+AYIVOACAAB4cAAAABSLuekqKxI57hfcQ2EkKocwtwB2+w==
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala ->
+rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHAVPh5iAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAhzcgATeHNidGkuYXBpLkNsYXNzTGlrZYM0HKHfsJdsAgAETAAOZGVmaW5pdGlvblR5cGV0ABpMeHNidGkvYXBpL0RlZmluaXRpb25UeXBlO1sAEHNhdmVkQW5ub3RhdGlvbnN0ABNbTGphdmEvbGFuZy9TdHJpbmc7TAAIc2VsZlR5cGV0ABBMeHNidGkvYXBpL0xhenk7TAAJc3RydWN0dXJlcQB+ABV4cgAheHNidGkuYXBpLlBhcmFtZXRlcml6ZWREZWZpbml0aW9u+RFusdVQPOICAAFbAA50eXBlUGFyYW1ldGVyc3QAGltMeHNidGkvYXBpL1R5cGVQYXJhbWV0ZXI7eHIAFHhzYnRpLmFwaS5EZWZpbml0aW9uhyob6HFC40YCAARMAAZhY2Nlc3N0ABJMeHNidGkvYXBpL0FjY2VzcztbAAthbm5vdGF0aW9uc3QAF1tMeHNidGkvYXBpL0Fubm90YXRpb247TAAJbW9kaWZpZXJzdAAVTHhzYnRpL2FwaS9Nb2RpZmllcnM7TAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwc3IAEHhzYnRpLmFwaS5QdWJsaWO6WD2ubC1gQgIAAHhyABB4c2J0aS5hcGkuQWNjZXNz3WKa+B1jMUgCAAB4cHVyABdbTHhzYnRpLmFwaS5Bbm5vdGF0aW9uO+uX6xkQ9o1IAgAAeHAAAAAAc3IAE3hzYnRpLmFwaS5Nb2RpZmllcnPHERMhaZzcJAIAAUIABWZsYWdzeHABdAAcZHNscy5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbnVyABpbTHhzYnRpLmFwaS5UeXBlUGFyYW1ldGVyO9ltJg8onfK2AgAAeHAAAAAAfnIAGHhzYnRpLmFwaS5EZWZpbml0aW9uVHlwZQAAAAAAAAAAEgAAeHIADmphdmEubGFuZy5FbnVtAAAAAAAAAAASAAB4cHQACENsYXNzRGVmdXIAE1tMamF2YS5sYW5nLlN0cmluZzut0lbn6R17RwIAAHhwAAAAAHNyABN4c2J0aS5TYWZlTGF6eSRJbXBsO5FPEfRFTMkCAANaAAhiaXRtYXAkMEwAAl90dAASTGphdmEvbGFuZy9PYmplY3Q7TAAEZXZhbHQAEUxzY2FsYS9GdW5jdGlvbjA7eHIAFnhzYnRpLmFwaS5BYnN0cmFjdExhennTd7UBX7vnoAIAAHhwAXNyABN4c2J0aS5hcGkuRW1wdHlUeXBlvP2eRkk7iSQCAAB4cgAUeHNidGkuYXBpLlNpbXBsZVR5cGVyeGKIISO/QAIAAHhyAA54c2J0aS5hcGkuVHlwZT9q2SEWSarKAgAAeHBwc3EAfgAuAXNyABN4c2J0aS5hcGkuU3RydWN0dXJlqar5gJNv2AACAANMAAhkZWNsYXJlZHEAfgAVTAAJaW5oZXJpdGVkcQB+ABVMAAdwYXJlbnRzcQB+ABV4cQB+ADVzcQB+AC4BdXEAfgAQAAAAAHBzcQB+AC4BdXEAfgAQAAAAAHBzcQB+AC4BdXIAEVtMeHNidGkuYXBpLlR5cGU7dP+lWnv56UECAAB4cAAAAAJzcgAUeHNidGkuYXBpLlByb2plY3Rpb27z0o1U6UWkLQIAAkwAAmlkcQB+ABxMAAZwcmVmaXh0ABZMeHNidGkvYXBpL1NpbXBsZVR5cGU7eHEAfgA0dAAGT2JqZWN0c3IAE3hzYnRpLmFwaS5TaW5nbGV0b278p1/4z1bkRgIAAUwABHBhdGh0ABBMeHNidGkvYXBpL1BhdGg7eHEAfgA0c3IADnhzYnRpLmFwaS5QYXRomz1cCM6lJ4QCAAFbAApjb21wb25lbnRzdAAaW0x4c2J0aS9hcGkvUGF0aENvbXBvbmVudDt4cHVyABpbTHhzYnRpLmFwaS5QYXRoQ29tcG9uZW50O0PaCXQtZxZ0AgAAeHAAAAADc3IADHhzYnRpLmFwaS5JZJgybIs3U8RAAgABTAACaWRxAH4AHHhyABd4c2J0aS5hcGkuUGF0aENvbXBvbmVudF+aIlsuhp+8AgAAeHB0AARqYXZhc3EAfgBNdAAEbGFuZ3NyAA54c2J0aS5hcGkuVGhpc9sJ7abMWkBcAgAAeHEAfgBOc3EAfgBBdAADQW55c3EAfgBFc3EAfgBIdXEAfgBLAAAAAnNxAH4ATXQABXNjYWxhcQB+AFRwcHNxAH4AEnEAfgAgdXEAfgAhAAAAAHNxAH4AIwB0ABxkc2xzLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9udXEAfgAmAAAAAH5xAH4AKHQABk1vZHVsZXVxAH4ALAAAAABzcQB+AC4BcQB+ADZwc3EAfgAuAXNxAH4AOHNxAH4ALgF1cQB+ABAAAAAAcHNxAH4ALgF1cQB+ABAAAAAAcHNxAH4ALgF1cQB+AD8AAAACc3EAfgBBcQB+AERzcQB+AEVzcQB+AEh1cQB+AEsAAAADc3EAfgBNcQB+AFBzcQB+AE1xAH4AUnEAfgBUc3EAfgBBcQB+AFZzcQB+AEVzcQB+AEh1cQB+AEsAAAACc3EAfgBNcQB+AFtxAH4AVHBwc3EAfgAScQB+ACB1cQB+ACEAAAAAc3EAfgAjAHQAEGRzbHMucmVnZXguRU1QVFl1cQB+ACYAAAAAcQB+AGF1cQB+ACwAAAAAc3EAfgAuAXEAfgA2cHNxAH4ALgFzcQB+ADhzcQB+AC4BdXEAfgAQAAAAAHBzcQB+AC4BdXEAfgAQAAAAAHBzcQB+AC4BdXEAfgA/AAAAA3NxAH4AQXQAEVJlZ3VsYXJFeHByZXNzaW9uc3EAfgBFc3EAfgBIdXEAfgBLAAAAA3NxAH4ATXQABGRzbHNzcQB+AE10AAVyZWdleHEAfgBUc3EAfgBBcQB+AERzcQB+AEVzcQB+AEh1cQB+AEsAAAADc3EAfgBNcQB+AFBzcQB+AE1xAH4AUnEAfgBUc3EAfgBBcQB+AFZzcQB+AEVzcQB+AEh1cQB+AEsAAAACc3EAfgBNcQB+AFtxAH4AVHBwc3EAfgAScQB+ACB1cQB+ACEAAAAAc3EAfgAjAHQAEmRzbHMucmVnZXguRVBTSUxPTnVxAH4AJgAAAABxAH4AYXVxAH4ALAAAAABzcQB+AC4BcQB+ADZwc3EAfgAuAXNxAH4AOHNxAH4ALgF1cQB+ABAAAAAAcHNxAH4ALgF1cQB+ABAAAAAAcHNxAH4ALgF1cQB+AD8AAAADc3EAfgBBdAARUmVndWxhckV4cHJlc3Npb25zcQB+AEVzcQB+AEh1cQB+AEsAAAADc3EAfgBNdAAEZHNsc3NxAH4ATXQABXJlZ2V4cQB+AFRzcQB+AEFxAH4ARHNxAH4ARXNxAH4ASHVxAH4ASwAAAANzcQB+AE1xAH4AUHNxAH4ATXEAfgBScQB+AFRzcQB+AEFxAH4AVnNxAH4ARXNxAH4ASHVxAH4ASwAAAAJzcQB+AE1xAH4AW3EAfgBUcHBzcQB+ABJxAH4AIHVxAH4AIQAAAABzcQB+ACMAdAASZHNscy5yZWdleC5MaXRlcmFsdXEAfgAmAAAAAHEAfgAqdXEAfgAsAAAAAHNxAH4ALgFxAH4ANnBzcQB+AC4Bc3EAfgA4c3EAfgAuAXVxAH4AEAAAAABwc3EAfgAuAXVxAH4AEAAAAABwc3EAfgAuAXVxAH4APwAAAAdzcQB+AEF0AAxTZXJpYWxpemFibGVzcQB+AEVzcQB+AEh1cQB+AEsAAAACc3EAfgBNcQB+AFtxAH4AVHNxAH4AQXEAfgDOc3EAfgBFc3EAfgBIdXEAfgBLAAAAA3NxAH4ATXEAfgBQc3EAfgBNdAACaW9xAH4AVHNxAH4AQXQAB1Byb2R1Y3RxAH4Az3NxAH4AQXQABkVxdWFsc3EAfgDPc3EAfgBBdAARUmVndWxhckV4cHJlc3Npb25zcQB+AEVzcQB+AEh1cQB+AEsAAAADc3EAfgBNdAAEZHNsc3NxAH4ATXQABXJlZ2V4cQB+AFRzcQB+AEFxAH4ARHNxAH4ARXNxAH4ASHVxAH4ASwAAAANzcQB+AE1xAH4AUHNxAH4ATXEAfgBScQB+AFRzcQB+AEFxAH4AVnEAfgDPcHBzcQB+ABJxAH4AIHVxAH4AIQAAAABzcQB+ACMAdAAQZHNscy5yZWdleC5VbmlvbnVxAH4AJgAAAABxAH4AKnVxAH4ALAAAAABzcQB+AC4BcQB+ADZwc3EAfgAuAXNxAH4AOHNxAH4ALgF1cQB+ABAAAAAAcHNxAH4ALgF1cQB+ABAAAAAAcHNxAH4ALgF1cQB+AD8AAAAHc3EAfgBBcQB+AM5zcQB+AEVzcQB+AEh1cQB+AEsAAAACc3EAfgBNcQB+AFtxAH4AVHNxAH4AQXEAfgDOc3EAfgBFc3EAfgBIdXEAfgBLAAAAA3NxAH4ATXEAfgBQc3EAfgBNdAACaW9xAH4AVHNxAH4AQXEAfgDbcQB+AP5zcQB+AEF0AAZFcXVhbHNxAH4A/nNxAH4AQXQAEVJlZ3VsYXJFeHByZXNzaW9uc3EAfgBFc3EAfgBIdXEAfgBLAAAAA3NxAH4ATXQABGRzbHNzcQB+AE10AAVyZWdleHEAfgBUc3EAfgBBcQB+AERzcQB+AEVzcQB+AEh1cQB+AEsAAAADc3EAfgBNcQB+AFBzcQB+AE1xAH4AUnEAfgBUc3EAfgBBcQB+AFZxAH4A/nBwc3EAfgAScQB+ACB1cQB+ACEAAAAAc3EAfgAjAHQAEWRzbHMucmVnZXguQ29uY2F0dXEAfgAmAAAAAHEAfgAqdXEAfgAsAAAAAHNxAH4ALgFxAH4ANnBzcQB+AC4Bc3EAfgA4c3EAfgAuAXVxAH4AEAAAAABwc3EAfgAuAXVxAH4AEAAAAABwc3EAfgAuAXVxAH4APwAAAAdzcQB+AEFxAH4AznNxAH4ARXNxAH4ASHVxAH4ASwAAAAJzcQB+AE1xAH4AW3EAfgBUc3EAfgBBcQB+AM5zcQB+AEVzcQB+AEh1cQB+AEsAAAADc3EAfgBNcQB+AFBzcQB+AE10AAJpb3EAfgBUc3EAfgBBcQB+ANtxAH4BLHNxAH4AQXQABkVxdWFsc3EAfgEsc3EAfgBBdAARUmVndWxhckV4cHJlc3Npb25zcQB+AEVzcQB+AEh1cQB+AEsAAAADc3EAfgBNdAAEZHNsc3NxAH4ATXQABXJlZ2V4cQB+AFRzcQB+AEFxAH4ARHNxAH4ARXNxAH4ASHVxAH4ASwAAAANzcQB+AE1xAH4AUHNxAH4ATXEAfgBScQB+AFRzcQB+AEFxAH4AVnEAfgEscHBzcQB+ABJxAH4AIHVxAH4AIQAAAABzcQB+ACMAdAAPZHNscy5yZWdleC5TdGFydXEAfgAmAAAAAHEAfgAqdXEAfgAsAAAAAHNxAH4ALgFxAH4ANnBzcQB+AC4Bc3EAfgA4c3EAfgAuAXVxAH4AEAAAAABwc3EAfgAuAXVxAH4AEAAAAABwc3EAfgAuAXVxAH4APwAAAAdzcQB+AEFxAH4AznNxAH4ARXNxAH4ASHVxAH4ASwAAAAJzcQB+AE1xAH4AW3EAfgBUc3EAfgBBcQB+AM5zcQB+AEVzcQB+AEh1cQB+AEsAAAADc3EAfgBNcQB+AFBzcQB+AE10AAJpb3EAfgBUc3EAfgBBcQB+ANtxAH4BWnNxAH4AQXQABkVxdWFsc3EAfgFac3EAfgBBdAARUmVndWxhckV4cHJlc3Npb25zcQB+AEVzcQB+AEh1cQB+AEsAAAADc3EAfgBNdAAEZHNsc3NxAH4ATXQABXJlZ2V4cQB+AFRzcQB+AEFxAH4ARHNxAH4ARXNxAH4ASHVxAH4ASwAAAANzcQB+AE1xAH4AUHNxAH4ATXEAfgBScQB+AFRzcQB+AEFxAH4AVnEAfgFacHB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAnNyABF4c2J0aS5hcGkuUGFja2FnZX5Zj/auzjlYAgABTAAEbmFtZXEAfgAceHB0AApkc2xzLnJlZ2V4c3EAfgF6dAAEZHNsc3NyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUwrhIlx1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAXNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5cQB+ABxMAA9zb3VyY2VEaXJlY3RvcnlxAH4AHHhwdAAwL1VzZXJzL3djaGVuL0Rlc2t0b3AvRFNML3JlZ3VsYXItZXhwcmVzc2lvbnMvYmludAA7L1VzZXJzL3djaGVuL0Rlc2t0b3AvRFNML3JlZ3VsYXItZXhwcmVzc2lvbnMvc3JjL21haW4vc2NhbGF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFB27rBKz8x3lLgA6eujcJIiTc/6P
+external apis:
+0 items
+source infos:
+3 items
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/Program.scala ->
+AAAAAAAAAAA=
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegexMatcher.scala ->
+AAAAAAAAAAA=
+/Users/wchen/Desktop/DSL/regular-expressions/src/main/scala/dsls/regex/RegularExpression.scala ->
+AAAAAAAAAAA=
+compilations:
+4 items
+0 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUwhzTTF1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAXNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQAMC9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL2JpbnQAOy9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL3NyYy9tYWluL3NjYWxh
+1 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUwrdL6p1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAXNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQAMC9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL2JpbnQAOy9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL3NyYy9tYWluL3NjYWxh
+2 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUwrfZZd1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAXNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQAMC9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL2JpbnQAOy9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL3NyYy9tYWluL3NjYWxh
+3 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUwrhIlx1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAXNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQAMC9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL2JpbnQAOy9Vc2Vycy93Y2hlbi9EZXNrdG9wL0RTTC9yZWd1bGFyLWV4cHJlc3Npb25zL3NyYy9tYWluL3NjYWxh
diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..83899ce
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.project b/.project
new file mode 100644
index 0000000..7ad749c
--- /dev/null
+++ b/.project
@@ -0,0 +1,13 @@
+
+ regular-expressions
+
+
+ org.scala-ide.sdt.core.scalabuilder
+
+
+
+ org.scala-ide.sdt.core.scalanature
+ org.eclipse.jdt.core.javanature
+
+
+
\ No newline at end of file
diff --git a/reflection.md b/reflection.md
index 0719389..b9182e8 100644
--- a/reflection.md
+++ b/reflection.md
@@ -1,9 +1,15 @@
# Reflection on implementing regular expressions of a DSL
+I tried to complete this assignment without my notes from the Complex number tutorial, and had the hardest time remembering all the nuances necessary when implementing an internal DSL. After fishing out my notes from that class, the assignment went by very quickly as it more or less layed out a framework for what needed to be done. It also saved me a lot of time by reminding me of several Scala-specifics such as putting the implicit conversions inside the companion object, importing the class when using implicit methods, importing postfixOps when using postfix operations, among other details.
+
## Which operators were easiest to implement and why?
+In particular, ||, ~, *, and + were extremely straight forward to implement considering they were all one liners. It helped a lot that the functionality was already implemented such that we only had to figure out the syntactical sugar. Even then, most of the tricks that were necessary to make the syntactical changes were already covered when we did the Complex number tutorial.
+
## Which operators were most difficult to implement and why?
+The operator that proved to be most difficult was probably the {n} repetition, but even then, after realizing to use an apply method, the actual implementation was not very difficult. I think conceptually I struggled most with implicit conversions as there are very Scala-specific details that need to addressed. For instance, I completely forgot that I had to import RegularExpression._ in order to use the implicit conversions. I can't even begin to imagine how difficult this assignment would have been had we not done the Complex number tutorial in class, as the tutorial covered companion objects, implicit conversion, postfix operators, when to use apply, among several other things. I think it also helped that this isn't my first time seeing Regular Expressions (CS81), so I could focus more on the implementation details rather than trying to understand the design and the motivations behind the DSL.
+
## Comment on the design of this internal DSL
Write a few brief paragraphs that discuss:
@@ -15,4 +21,12 @@ Write a few brief paragraphs that discuss:
you implement it _or_ what features of Scala would prevent you from
implementing it? (You don't have to write code for this part. You could say
"I would use literal extension to..." or "Scala's rules for valid
- identifiers prevent...")
\ No newline at end of file
+ identifiers prevent...")
+
+This design seems to be geared more towards mathemeticians not so well versed in computer science that want to use regular expressions. Almost immediately, the first application that comes to mind is CS81, which is a Logic and Computability course offered at Harvey Mudd. It seems like this DSL would be helpful for students in that class as the syntax is more intuitive in that it reflects exactly how regular expressions look when they are taught or when they are introduced in the textbook. However, at the same time, to someone who isn't familiar with regular expressions but is familiar with computer science, perhaps calling each method would make more sense than the DSL we provided. For instance, Concat(Star(hello), world) may make more sense than hello* + world as the ordering of operations is not as explicit in our DSL.
+
+The DSL makes writing regular expressions both easy and intuitive, as it should. As such, the DSL makes writing any pattern-oriented data pretty easy (by nature of regular expressions). On the same note, the DSL is extremely domain specific in that trying to do anything else besides writing regular expressions would be quite cumbersome. Things that cannot be easily described with regular expressions prove to be difficult. For instance, checking a string to see if it's a palindrome would be difficult because the string is not regular.
+
+One syntactic change that I actually made was implementing both the Kleene star <*> and the concatanation operator <+> as just * and +. I felt like this change was not particularly difficult to make (as it involved simply leveraging this <*> and this <+>). It makes the DSL look pretty much exactly like how a regular expression would be written. I think although it would be pretty bad to overload + and * as these are already existing operators that are very commonly used, given how specific this DSL is, I don't imagine the users would explain a lot.
+
+
diff --git a/src/main/scala/dsls/regex/Program.scala b/src/main/scala/dsls/regex/Program.scala
index 38a0302..ed03e7a 100644
--- a/src/main/scala/dsls/regex/Program.scala
+++ b/src/main/scala/dsls/regex/Program.scala
@@ -1,4 +1,7 @@
package dsls.regex
+import scala.language.postfixOps
+// Import to allow for implicit conversions in regular expressions
+import RegularExpression._
object Program extends App {
@@ -9,16 +12,26 @@ object Program extends App {
* val zero = '0'
* etc.
***************************************************************************/
- val zero = Literal('0')
- val one = Literal('1')
- val two = Literal('2')
- val three = Literal('3')
- val four = Literal('4')
- val five = Literal('5')
- val six = Literal('6')
- val seven = Literal('7')
- val eight = Literal('8')
- val nine = Literal('9')
+// val zero = Literal('0')
+// val one = Literal('1')
+// val two = Literal('2')
+// val three = Literal('3')
+// val four = Literal('4')
+// val five = Literal('5')
+// val six = Literal('6')
+// val seven = Literal('7')
+// val eight = Literal('8')
+// val nine = Literal('9')
+ val zero = '0'
+ val one = '1'
+ val two = '2'
+ val three = '3'
+ val four = '4'
+ val five = '5'
+ val six = '6'
+ val seven = '7'
+ val eight = '8'
+ val nine = '9'
require(zero matches "0")
require(one matches "1")
@@ -37,7 +50,8 @@ object Program extends App {
* Make it possible to replace the definition of answer with:
* val answer = "42"
***************************************************************************/
- val answer = Concat(four, two)
+// val answer = Concat(four, two)
+ val answer = "42"
require(answer matches "42")
@@ -47,9 +61,9 @@ object Program extends App {
* Make it possible to replace the definition of digit with:
* val digit = '0' || '1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9'
***************************************************************************/
- val digit = Union(zero, Union(one, Union(two, Union(three, Union(four,
- Union(five, Union(six, Union(seven, Union(eight, nine)))))))))
-
+// val digit = Union(zero, Union(one, Union(two, Union(three, Union(four,
+// Union(five, Union(six, Union(seven, Union(eight, nine)))))))))
+ val digit = '0' || '1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9'
require(digit matches "0")
require(digit matches "1")
require(digit matches "2")
@@ -67,8 +81,8 @@ object Program extends App {
* Make it possible to replace the definition of digit with:
* val pi = '3' ~ '1' ~ '4'
***************************************************************************/
- val pi = Concat(Literal('3'), Concat(Literal('1'), Literal('4')))
-
+// val pi = Concat(Literal('3'), Concat(Literal('1'), Literal('4')))
+ val pi = '3' ~ '1' ~ '4'
require(pi matches "314")
/****************************************************************************
@@ -77,7 +91,8 @@ object Program extends App {
* Make it possible to replace the definition of zeroOrMoreDigits with:
* val zeroOrMoreDigits = digit <*>
***************************************************************************/
- val zeroOrMoreDigits = Star(digit)
+// val zeroOrMoreDigits = Star(digit)
+ val zeroOrMoreDigits = digit*
require(zeroOrMoreDigits matches "")
require(zeroOrMoreDigits matches "0")
@@ -91,7 +106,8 @@ object Program extends App {
* Make it possible to replace the definition of number with:
* val number = digit <+>
***************************************************************************/
- val number = Concat(digit, zeroOrMoreDigits)
+// val number = Concat(digit, zeroOrMoreDigits)
+ val number = digit+
require(!(number matches ""))
require(number matches "0")
@@ -105,8 +121,8 @@ object Program extends App {
* Make it possible to replace the definition of cThree with:
* val cThree = 'c'{3}
***************************************************************************/
- val cThree = Concat(Literal('c'), Concat(Literal('c'), Literal('c')))
-
+// val cThree = Concat(Literal('c'), Concat(Literal('c'), Literal('c')))
+ val cThree = 'c'{3}
require(cThree matches "ccc")
/****************************************************************************
diff --git a/src/main/scala/dsls/regex/RegularExpression.scala b/src/main/scala/dsls/regex/RegularExpression.scala
index 199fe1e..f763d9c 100644
--- a/src/main/scala/dsls/regex/RegularExpression.scala
+++ b/src/main/scala/dsls/regex/RegularExpression.scala
@@ -11,6 +11,54 @@ package dsls.regex
abstract class RegularExpression {
/** returns true if the given string matches this regular expression */
def matches(string: String) = RegexMatcher.matches(string, this)
+// Handles matches for a character input, not necessary if we have implicit conversion
+// def matches(char: Char) = RegexMatcher.matches(char.toString, this)
+ /** allows users to use || as union operator */
+ def ||(rest: RegularExpression) = Union(this, rest)
+
+ /** allows users to use ~ as concatenation operator */
+ def ~(rest: RegularExpression) = Concat(this, rest)
+
+ /** allows users to use * or <*> for 0 or more repetitions */
+ def <*> = Star(this)
+ /** leverage implemented <*> to allow for flexibility in syntax */
+ def * = this <*>
+
+ /** allows users to use + or <+> for 1 or more repetitions */
+ def <+> = this ~ this*
+ /** leverage implemented <+> to allow for flexibility in syntax */
+ def + = this <+>
+
+ /** uses pattern matching to allow users to use {n} to represent n repetitions of this */
+ def apply(repeats: Int): RegularExpression = {
+ repeats match {
+ case 0 => EPSILON
+ // Recursive case where we concatenate 1 instance of this
+ case x => this ~ this{repeats-1}
+ }
+ }
+}
+
+/** A companion object for RegularExpression to handle implicit conversions*/
+object RegularExpression {
+ /** implicit conversion from Char to valid RegularExpression */
+ implicit def charToRegex(char: Char): RegularExpression = Literal(char)
+
+ /** implicit conversion from String to valid RegularExpression */
+ implicit def stringToRegex(string: String): RegularExpression = {
+ // Convert string to a list of literals such that they are valid RegularExpressions
+ val listLiterals: List[RegularExpression] = string.toList map Literal
+
+ // Method that uses pattern matching to reconstruct the literals
+ def literalsCombine(list: List[RegularExpression]): RegularExpression = {
+ list match {
+ case Nil => EPSILON
+ case (x::xs) => Concat(x, literalsCombine(xs))
+ }
+ }
+ // Call literalsCombine to concatenate literals to make a RegularExpression
+ literalsCombine(listLiterals)
+ }
}
/** a regular expression that matches nothing */