factor common prefixes from alternations

Juggle code so that RE2::Set can benefit too.

R=rsc
CC=re2-dev
http://codereview.appspot.com/1740045
diff --git a/re2/tostring.cc b/re2/tostring.cc
index a4aabbe..555524f 100644
--- a/re2/tostring.cc
+++ b/re2/tostring.cc
@@ -75,6 +75,7 @@
     case kRegexpWordBoundary:
     case kRegexpNoWordBoundary:
     case kRegexpCharClass:
+    case kRegexpHaveMatch:
       nprec = PrecAtom;
       break;
 
@@ -237,7 +238,10 @@
       break;
 
     case kRegexpEndText:
-      t_->append("(?-m:$)");
+      if (re->parse_flags() & Regexp::WasDollar)
+        t_->append("(?-m:$)");
+      else
+        t_->append("\\z");
       break;
 
     case kRegexpWordBoundary:
@@ -272,6 +276,13 @@
     case kRegexpCapture:
       t_->append(")");
       break;
+
+    case kRegexpHaveMatch:
+      // There's no syntax accepted by the parser to generate
+      // this node (it is generated by RE2::Set) so make something
+      // up that is readable but won't compile.
+      t_->append("(?HaveMatch:%d)", re->match_id());
+      break;
   }
 
   // If the parent is an alternation, append the | for it.