@@ -620,10 +620,41 @@ def invoke(self, rdr, ch):
620620 read_inner (rdr , True , always_return_form = True )
621621 return rdr
622622
623+ class RegexReader (ReaderHandler ):
624+ def invoke (self , rdr , ch ):
625+ regex_str = LiteralStringReader ().invoke (rdr , ch )
626+ regex_opts = EMPTY_SET
627+ opts_dict = {
628+ u"a" : keyword (u"ascii" ),
629+ u"p" : keyword (u"posix" ),
630+ u"l" : keyword (u"longest_match" ),
631+ u"s" : keyword (u"silent" ),
632+ u"L" : keyword (u"literal" ),
633+ u"n" : keyword (u"never_nl" ),
634+ u"m" : keyword (u"dot_nl" ),
635+ u"c" : keyword (u"never_capture" ),
636+ u"i" : keyword (u"ignore_case" )
637+ }
638+
639+ # read options (https://github.com/google/re2/blob/master/re2/re2.h#L517)
640+ while True :
641+ try :
642+ opt = opts_dict .get (rdr .read (), None )
643+ if opt is None :
644+ rdr .unread ()
645+ break
646+ else :
647+ regex_opts = regex_opts .conj (opt )
648+ except EOFError :
649+ break
650+
651+ return rt .cons (symbol (u"re2" ), rt .cons (regex_str , rt .cons (regex_opts , nil )))
652+
623653dispatch_handlers = {
624654 u"{" : SetReader (),
625655 u"(" : FnReader (),
626- u"_" : CommentReader ()
656+ u"_" : CommentReader (),
657+ u"\" " : RegexReader ()
627658}
628659
629660class DispatchReader (ReaderHandler ):
0 commit comments