<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -11,7 +11,7 @@ import Global._
 trait Parsers {
   private val TAIL_ERROR_PATTERN = &quot;Unexpected trailing characters: '%s'&quot;
   
-  implicit def literal(str: String): Parser[String] = new LiteralParser(str)
+  implicit def literal(str: String) = new LiteralParser(str)
   
   def opt[A](p: Parser[A]) = p?
   
@@ -296,11 +296,7 @@ trait Parsers {
     
     def +? = (this+)?
     
-    /**
-     * WARNING: may cause non-termination if used recursively.  Really
-     * should be restricted to {@link TerminalParser}.
-     */
-    def \(not: Parser[Any]): Parser[R] = new NonTerminalParser[R] {   // TODO
+    def \(not: TerminalParser[Any]): Parser[R] = new NonTerminalParser[R] {
       def computeFirst(seen: Set[Parser[Any]]) = self.computeFirst(seen)
       
       def queue(t: Trampoline, in: LineStream)(f: Result[R]=&gt;Unit) {
@@ -382,7 +378,7 @@ trait Parsers {
       case other =&gt; super.~(other)
     }
     
-    override def \(not: Parser[Any]) = new TerminalParser[R] {
+    override def \(not: TerminalParser[Any]) = new TerminalParser[R] {
       def computeFirst(s: Set[Parser[Any]]) = self.computeFirst(s)
       
       def parse(in: LineStream) = self.parse(in) match {</diff>
      <filename>src/main/scala/edu/uwm/cs/gll/Parsers.scala</filename>
    </modified>
    <modified>
      <diff>@@ -8,7 +8,7 @@ trait RegexParsers extends Parsers {
   protected val whitespace = &quot;&quot;&quot;\s+&quot;&quot;&quot;r
   protected val skipWhitespace = true
   
-  override implicit def literal(str: String): Parser[String] = {
+  override implicit def literal(str: String): LiteralParser = {
     if (skipWhitespace) {
       new LiteralParser(str) {
         override def computeFirst(seen: Set[Parser[Any]]) = Some(UniversalOptCharSet)    // because of whitespace
@@ -19,7 +19,7 @@ trait RegexParsers extends Parsers {
     } else super.literal(str)
   }
   
-  implicit def regex(r: Regex): Parser[String] = {
+  implicit def regex(r: Regex): RegexParser = {
     if (skipWhitespace) {
       new RegexParser(r) {
         override def computeFirst(seen: Set[Parser[Any]]) = Some(UniversalOptCharSet)
@@ -29,7 +29,17 @@ trait RegexParsers extends Parsers {
     } else new RegexParser(r)
   }
   
-  implicit def disjunctiveRegex(left: Regex) = new RichParser(regex(left))
+  override implicit def disjunctiveLiterals(left: String) = new RichParser(literal(left)) {
+    def |(right: Regex) = new RegexParser(new Regex(&quot;(&quot; + escapeRegex(left) + &quot;)|(&quot; + right + &quot;)&quot;))
+    
+    def |(right: String) = new RegexParser(new Regex(&quot;(&quot; + escapeRegex(left) + &quot;)|(&quot; + escapeRegex(right) + &quot;)&quot;))
+  }
+  
+  implicit def disjunctiveRegex(left: Regex) = new RichParser(regex(left)) {
+    def |(right: Regex) = new RegexParser(new Regex(&quot;(&quot; + left + &quot;)|(&quot; + right + &quot;)&quot;))
+    
+    def |(right: String) = new RegexParser(new Regex(&quot;(&quot; + left + &quot;)|(&quot; + escapeRegex(right) + &quot;)&quot;))
+  }
   
   implicit def funRegexSyntax(p: Regex) = new RichSyntax1(regex(p))
   
@@ -42,6 +52,17 @@ trait RegexParsers extends Parsers {
     super.processTail(newTail)
   }
   
+  private def escapeRegex(str: String) = {
+    val specialChars = Set('[', ']', '{', '}', '\\', '|', '*', '+', '?', '^', '$', '(', ')')
+    
+    str.toCharArray.foldLeft(&quot;&quot;) { (str, c) =&gt;
+      if (specialChars contains c)
+        str + '\\' + c
+      else
+        str + c
+    }
+  }
+  
   private def handleWhitespace(s: LineStream) =
     s.drop(whitespace findPrefixOf s map { _.length } getOrElse 0)
   </diff>
      <filename>src/main/scala/edu/uwm/cs/gll/RegexParsers.scala</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>73f6950196d72f44b0e2f49035a3c31eef872d7b</id>
    </parent>
  </parents>
  <author>
    <name>Daniel Spiewak</name>
    <email>djspiewak@gmail.com</email>
  </author>
  <url>http://github.com/djspiewak/gll-combinators/commit/a0c2e3e0b6dd31e3802a65f93077b43150b28ec9</url>
  <id>a0c2e3e0b6dd31e3802a65f93077b43150b28ec9</id>
  <committed-date>2009-10-31T09:08:27-07:00</committed-date>
  <authored-date>2009-10-31T09:08:27-07:00</authored-date>
  <message>Added | combinator override for string parsers within the context of regexps</message>
  <tree>23fdfae9d872c379aa0a7feb5b329ed2f3439cff</tree>
  <committer>
    <name>Daniel Spiewak</name>
    <email>djspiewak@gmail.com</email>
  </committer>
</commit>
