Skip to content

Commit befe7e3

Browse files
committed
RegexReader for #" syntax
RegexReader transforms #"foo"iL into (re2 "foo" {:ignore_case :literal})
1 parent 0b8882e commit befe7e3

1 file changed

Lines changed: 32 additions & 1 deletion

File tree

pixie/vm/reader.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
623653
dispatch_handlers = {
624654
u"{": SetReader(),
625655
u"(": FnReader(),
626-
u"_": CommentReader()
656+
u"_": CommentReader(),
657+
u"\"": RegexReader()
627658
}
628659

629660
class DispatchReader(ReaderHandler):

0 commit comments

Comments
 (0)