Îõ³h&Q «Ñ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP Safe-Inferred"Üëï sasha+Optimized routing to check membership when  is statically known.   c ws = [||  $$c $$(liftTyped ws) ||]      Safe-Inferred")*ÁÃÄÅÇÜëï Ç!sashaExtended regular expression"sasha Concatenation#sashaUnion$sasha Kleene star%sasha Complement&sasha%Empty regex. Doesn't accept anything.match empty s === False'sasha Everything.match everything s === True(sashaEmpty string. Note: different than &.match eps s === null s)sasha Character.*sashaCharacter range.+sashaAny character.-sasha Concatenate regular expressions.r <> empty === emptyempty <> r === empty ( r <> s) <> t === r <> (s <> t)r <> eps === reps <> r === r.sashaUnion of regular expressions. r \/ r === rr \/ s === s \/ r ( r \/ s) \/ t === r \/ (s \/ t)empty \/ r === rr \/ empty === reverything \/ r === everythingr \/ everything === everything/sasha$Intersection of regular expressions. r /\ r === rr /\ s === s /\ r ( r /\ s) /\ t === r /\ (s /\ t)empty /\ r === emptyr /\ empty === emptyeverything /\ r === rr /\ everything === r0sasha Complement. complement (complement r) === r1sasha Kleene star.star (star r) === star ( r)star eps === epsstar empty === epsstar anyChar === everythingstar (r \/ eps) === star r&star (char c \/ eps) === star (char c)star (empty \/ eps) === eps2sasha Kleene plus 2 r = r <> 1 r 3sashaLiteral string.4sasha UTF8 string5sasha.UTF8 character, i.e. may match multiple bytes.8sashaåWe say that a regular expression r is nullable if the language it defines contains the empty string. nullable epsTruenullable (star "x")Truenullable "foo"Falsenullable (complement eps)False9sasha*Intuitively, the derivative of a language  \mathcal{L} \subset \Sigma^\star with respect to a symbol  a \in \SigmaÕ is the language that includes only those suffixes of strings with a leading symbol a in  \mathcal{L}.;sashaWhether ! is (structurally) equal to &.<sashaWhether ! is (structurally) equal to '.>sashaUses smart constructors.?sashaUses  utf8string.!"#$%&'()*+,-./0123456789:;<=!"#$%&()*5+,-./12340'67=89:;< Safe-Inferred"Üëï Hsasha:Lexer grammar specification: tags and regular expressions.IsashaScan for a single token.Isashascanner definitionsashainputsasha8matched token, consumed bytestring, left over bytestring!&()*+,-./01234567HIHI!&()*5+,-./1234067 Safe-Inferred"Üëï Qsasha2We give each tag an integer, so we can order them.RsashaLast accept modifier.SsashaInner scanner function.previous matchpositioninputJsasha?Lexer grammar specification: tag codes and regular expressions.KsashaGenerate a scanner code.!&()*+,-./01234567JKJK!&()*5+,-./1234067Ô      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUÖsasha-0-1pavLtW5SSX9MmYRyu5QlMSasha.Internal.Word8SetSasha.Internal.ERESasha Sasha.TTHKeyWord8Setemptyfull singletonrangeinsertdeletenullisFullsizemember memberCode isSubsetOf isSingleRange complementunion intersectionfindMinfindMaxelemstoListfromList $fBoundedMeetSemiLatticeWord8Set $fBoundedJoinSemiLatticeWord8Set$fLatticeWord8Set$fArbitraryWord8Set$fMonoidWord8Set$fSemigroupWord8Set$fLiftBoxedRepWord8Set$fShowWord8Set $fEqWord8Set $fOrdWord8SetERE EREAppendEREUnionEREStarERENot everythingepschar charRangeanyChar anyUtf8Charappendsunions intersectionsstarplusstring utf8Stringutf8Charsatisfydigitnullable derivativematchisEmpty isEverything equivalent$fArbitraryERE $fIsStringERE$fBoundedMeetSemiLatticeERE$fBoundedJoinSemiLatticeERE $fLatticeERE $fMonoidERE$fSemigroupERE$fEqERE$fOrdERE $fShowEREsashaSaTTHsatth$fOrdS$fEqS$fShowS$fEqMeas $fOrdMeasSMR