Îõ³h&øGÆjª      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê ËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõ ö ÷ ø ù ú û ü ý þ ÿ € � ‚ ƒ „ … †‡ˆ ‰ Š ‹ Œ � Ž � � ‘ ’ “ ” • – — ˜ ™ š › œ � ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ôõö÷øùúûüýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€ � ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ � Ž � � ‘ ’ “ ” • – — ˜ ™ š › œ � ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ € � ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ � Ž � � ‘ ’ “ ” • – — ˜ ™ š › œ � ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ € � ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ � !Ž "� "� "‘ "’ "“ "” "• "– "— "˜ "™ "š "› "œ "� "ž "Ÿ "  "¡ "¢ "£ "¤ "¥ "¦ "§ #¨ #© #ª #« #¬ $­ $® $¯ $° $± $² $³ $´ $µ $¶ $· $¸ $¹ $º %» %¼ %½ %¾ %¿ %À %Á & &à &Ä &Å &Æ &Ç &È &É &Ê &Ë &Ì &Í &Î &Ï &Ð 'Ñ 'Ò 'Ó 'Ô 'Õ 'Ö '× 'Ø 'Ù 'Ú 'Û 'Ü 'Ý 'Þ 'ß 'à 'á 'â 'ã 'ä 'å 'æ 'ç 'è (é (ê (ë )ì *í *î *ï *ð *ñ +ò +ó +ô ,õ ,ö ,÷ ,ø ,ù ,ú ,û ,ü ,ý ,þ ,ÿ ,€ ,� ,‚ ,ƒ ,„ ,… ,† ,‡ ,ˆ ,‰ ,Š ,‹ ,Œ ,� ,Ž ,� ,� ,‘ ,’ -“ -” -• -– .— .˜ .™ .š .› .œ .� .ž .Ÿ .  /¡ 0¢ 0£ 0¤ 0¥ 0¦ 0§ 0¨ 0© 0ª 0« 0¬ 0­ 0® 0¯ 0° 0± 0² 0³ 0´ 0µ 1¶ 1· 1¸ 1¹ 1º 2» 2¼ 2½ 2¾ 2¿ 3À 3Á 3 3à 3Ä 3Å 3Æ 3Ç 3È 4É 4Ê 4Ë 5Ì 5Í 5Î 5Ï 5Ð 5Ñ 5Ò 5Ó 5Ô 6Õ 6Ö 7× 7Ø 7Ù 7Ú 7Û 7Ü 7Ý 7Þ 7ß 7à 8á 8â 9ã :ä ;å ;æ ;ç <è <é <ê <ë <ì <í <î <ï <ð <ñ <ò <ó <ô <õ <ö =÷ =ø =ù =ú =û =ü =ý =þ =ÿ =€ =� =‚ >ƒ >„ >… >† >‡ >ˆ >‰ >Š >‹ >Œ >� >Ž >� >� >‘ ?’ ?“ ?” @• @– @— A˜ B™ Bš B› Bœ B� Bž BŸ C  C¡ C¢ C£ C¤ D¥ D¦ D§ D¨ D© Dª D« D¬ D­ D® D¯ D° D± D² D³ D´ Eµ E¶ E· E¸ E¹ Eº E» E¼ E½ E¾ E¿ EÀ EÁ F Fà FÄ FÅ FÆ FÇ FÈ FÉ GÊ GË GÌ GÍ GÎ GÏ GÐ GÑ GÒ GÓ GÔ HÕ HÖ H× HØ HÙ HÚ HÛ HÜ HÝ HÞ Hß Ià Já Kâ Lã Mä Må Mæ Nç Oè Pé Pê Pë Pì Pí Qî Rï Rð Rñ Rò Ró Rô Rõ Rö R÷ Rø Rù Rú Rû Rü Rý Rþ Rÿ R€R�R‚SƒT„T…T†T‡TˆT‰TŠT‹UŒV�VŽV�V�V‘W’W“W”W•W–W—W˜W™WšW›WœX�XžXŸX X¡X¢X£X¤X¥X¦X§X¨X©XÛNone#$%05679>?ÀÁÂÄÎÑÔÙàáè$ëBNFC3$Get the start position of something.íBNFC3+Start position (line, column) of something.Õëìíîïðÿþýüûúùø÷öõôóòñ€�ƒ‚„…†‡ˆ�Ž�Œ�‰Š‹‘’•”“–—˜™šŸž�œ› ¡£¢¤¥§¦¨©¹¸´³²±°¬ª¶­¯·«®µº»¼½¾¿Õ½»¼º©¹¸´³²±°¬ª¶­¯·«®µ¨¥§¦¤¡£¢ šŸž�œ›™—˜–’•”“‘ˆ�Ž�Œ�‰Š‹‡…†„�ƒ‚€ðÿþýüûúùø÷öõôóòñîïí¿¾ëìYNone#$%05679>?ÀÁÂÄÎÑÔÙàáè%˜ZNone#$%05679>?ÀÁÂÄÎÑÔÙàáè%ÕNone#$%05679>?ÀÁÂÄÇÎÑÔÙàáè+�°BNFC3>Finite map from text to token organized as binary search tree.±BNFC3 Nil (leaf).²BNFC3 Binary node.³BNFC3Token with position.¶BNFC3*Keyword or symbol tokens have a unique ID.¸BNFC3Keyword or symbol text.¹BNFC3 Unique ID.ºBNFC3Token without position.»BNFC3Reserved word or symbol.¼BNFC3String literal.½BNFC3Integer literal.¾BNFC3 Identifier.¿BNFC3Float literal.ÀBNFC3Character literal.ÂBNFC3Smart constructor for º) for the sake of backwards compatibility.ÊBNFC3Create a token with position.ËBNFC3Pretty print a position.ÌBNFC39Pretty print the position of the first token in the list.ÍBNFC3Get the position of a token.ÎBNFC3Get line and column of a token.ÏBNFC3"Get line and column of a position.ÐBNFC3+Convert a token into "position token" form.ÑBNFC3Convert a token to its text.ÒBNFC3Convert a token to a string.ÓBNFC3ÀConvert potential keyword into token or use fallback conversion.ÔBNFC3ÉThe keywords and symbols of the language organized as binary search tree.ÕBNFC3Unquote string literal.ÛBNFC3ÂEncode a Haskell String to a list of Word8 values, in UTF8 format.éBNFC37Keyword/symbol ordering is determined by the unique ID.êBNFC37Keyword/symbol equality is determined by the unique ID.Ì�Ÿ ž¡£¤¢¥©¨§¦ª«¬­®¯°²±³´µ¶·¹¸ºÁÀ¿¾½»¼ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèÌÃÄÅÆÇÈÉä奩¨§¦æçè¡£¤¢�Ÿ žÊºÁÀ¿¾½»¼Â¶·¹¸³´µËÌÍÎÏÐÑÒ°²±ÓÔÕ®¯Ö×­¬ØÙÚÛÜÝÞßàá⪫ãNone#$%05679>?ÀÁÂÄÎÑÔÙàáè-ööNone#$%05679>?ÀÁÂÄÇÎÑÔÙàáèé-G÷øùúûüýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��÷øùúûüýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��ª9 «9 None#$%05679>?ÀÁÂÄÎÑÔÙàáè.R‘BNFC3The printer class does the job.”BNFC3The top-level printing method. ‘’“”•–—˜™š›œ� ”“•–—˜™š‘’›œ� None#$%05679>?ÀÁÂÄÎÑÔÙàáè2r ¶BNFC3'A proper name for a generic decoration.ºBNFC3?A decoration is a functor that is traversable into any functor.The ,Ó superclass is given because of the limitations of the Haskell class system.  traverseF actually implies functoriality.Minimal complete definition:  traverseF or  distributeF.»BNFC3 traverseF is the defining property.¼BNFC3%Decorations commute into any functor.¾BNFC3'Decorations commute into any bifunctor.¿BNFC3#Any decoration is traversable with traverse = traverseF. Just like any 76 is a functor, so is any decoration, given by just  traverseF , a functor.ÀBNFC3Any decoration is a lens. set is a special case of dmap.ÁBNFC30A typical decoration is pairing with some stuff.ÂBNFC33Decorations compose. (Thus, they form a category.)ÃBNFC3%The identity functor is a decoration. ¶·¹¸º¾½¼»¿À º¾½¼»¿À¶·¹¸None#$%05679>?ÀÁÂÄÎÑÔÙàáè6 ËBNFC3 Non-empty ¯.ÌBNFC3(Non-empty list. TODO change to newtype?ÎBNFC3%Return the last element and the rest.ÏBNFC3Build a list with one element.ÐBNFC3"Append a list to a non-empty list.ÑBNFC3#Prepend a list to a non-empty list.ÒBNFC3More precise type for snoc.ÓBNFC3(Concatenate one or more non-empty lists.ÔBNFC3Like [\8. Duplicates in the first list are not removed. O(nm).×BNFC3ÆChecks if all the elements in the list are equal. Assumes that the '6 instance stands for an equivalence relation. O(n).ØBNFC3Like ¬.ÙBNFC3Like b.ÚBNFC3Like ]^.ÛBNFC3Like ]_.ÜBNFC3Like ]`.ÝBNFC3Like ab.ÞBNFC3Like ab.ßBNFC3Unsafe!ÍOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†®ËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞÍËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†®None#$%05679>?ÀÁÂÄÉÎÑÔ×Ùàáè7 àBNFC3Lists of length åD2.åBNFC3Safe.æBNFC3Safe.çBNFC3Safe.éBNFC3Unsafe!êBNFC3Unsafe! àáâãäåæçèéêë àáâãäåæçèéêë None#$%05679>?ÀÁÂÄÎÑÔÙàáè8õö÷õö÷ None#$%05679>?ÀÁÂÄÎÑÔÙàáè9 øBNFC3 Overloaded  singleton constructor for collections.úBNFC3ßA create-only possibly empty collection is a monoid with the possibility to inject elements.øùúûúûøùNone#$%05679>?ÀÁÂÄÎÑÔÙàáè9ý†BNFC3+spanEnd p l == reverse (span p (reverse l)). Invariant: 2l == front ++ end where (end, front) = spanEnd p l (From package ghc, module Util.)› ­®%ðï&óôòñ '¹(½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÍÌ)è é*âãäåæç+,¬-žŸ  ¡ .´µ¶·¸³/»º01ÎÏÐÑÒÓÔÕÖרÙÛÚ2êëìîí3úûü45­$#"6«¨¦§­¤¥¬ª®°¯©7‡‰Šˆ8ª«9! :FI;<=>?@GHANLMBCDEJK¯°±²|ƒ³´µ¶·¸¹º»¼½¾¿ÀÁ‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡Â¢Ã£±²³´ÄÅÆÇȵ¶ÉÊËÌÍÎÏ·ÐѸ¹¼ÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€�‚ƒ„ÜÝÞßàá…†‡õö÷øùýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—ˆ¬‰Š‹Œ�Ž˜�™�‘’š“›œ�¢£¤¥¦§¨”•–—˜™š›©œ�ž®¯°±²º»¼½¾¿Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâÀÁÂÃÛÇÜÄØÚÙÅäÉÆâÊãäåæçèéêëìíîïðñòóôõö÷øÈÒËçèÌàÍÐÑÎÐÏ×ÓÔÕÖßÞÝáãåæéê¶·¸¹º¾½»¼¿ÀËÌÍàáõö÷øùúû†‡Â %ðï&óôòñ '¹(½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÍÌ)è é*âãäåæç+,¬-žŸ  ¡ .´µ¶·¸³/»º01ÎÏÐÑÒÓÔÕÖרÙÛÚ2êëìîí3úûü45­$#"6¨¦§­¤¥¬ª®°¯©7‡‰Šˆ89! :FI;<=>?@GHANLMBCDEJK‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£±²³´µ¶·¸¹¼ÜÝÞßàáõö÷øùýþÿ€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜š›œ�¢£¤¥¦§¨©¯°±²º»¼|ƒ®ËÌÍàáÌàßÞÝáÂÃÛÇÜÆâÊãÀÁÄØÚÙÅäÉåæÈÒÍÐÑÎÐÏËçè×ÓÔÕÖé꽫œ™8ª«|ƒ®¾¿†‡ None#$%05679>?ÀÁÂÄÎÑÔÙàáèLMˆBNFC3Atomic character class.‰BNFC3A single character.ŠBNFC30-9, LBNF digit.‹BNFC3Lower case character, LBNF lower.ŒBNFC3Upper case character, LBNF upper.�BNFC30Possibly overlapping union of character classes.ŽBNFC3Any character, LBNF char.�BNFC3ÀAny of the given (åD0) alternatives. List is free of duplicates.�BNFC3ÆCharacter classes are regular expressions that recognize character sequences of length exactly one. These are often distinguished from arbitrary regular expressions in lexer generators, e.g. in alex.ÖWe represent character classes as a difference of unions of atomic character classes. Semantics: +æO CMinus ccYes ccNo çO = æO ccYes çO æO ccNo çO’BNFC3ÀCharacter in question must be in one of these character classes.“BNFC3ÙCharacter in question must not be in one of these character classes. Must be empty if ’ is empty.”BNFC38Check if a regular expression matches at least one word.9For differences, this check may err on the positive side.–BNFC3;Regular expressions are constructed over character classes.,Use smart constructors to ensure invariants.—BNFC3Atomic regular expression.˜BNFC3-Alternative/sum: List free of duplicates and RAlt². We use list instead of set to preserve the order given by the user. Empty list would mean empty language, but this is instead represented by the empty character class.™BNFC3°Difference. Most lexer generators do not support difference in general, only at the level of character classes. LBNF has general difference, so it is represented here.šBNFC3,Language of the empty word (empty sequence).›BNFC3 Sequence/product. List free of RSeq. Empty list is eps (language of the empty word).œBNFC30 or more repetitions. – isn't œ, �, ž, ˜ [] nor š.�BNFC31 or more repetitions. – isn't œ, �, ž, ˜ [] nor š.žBNFC30 or 1 repetitions. – isn't œ, �, ž, ˜ [] nor š.¥BNFC3ÅCheck if a regular expression is nullable (accepts the empty string).§BNFC30Simplifications included, but no distributivity.¯BNFC3ÈDisjunction of two character classes is either a character class again (—) or simply the disjunction (£).*(p1 m1) ªD (p2 m2) = (p1 ªD p2) (m1 ªD m2) if p1 ¥E m2 and p2 ¥E m1°BNFC3ÈDisjunction of two character classes is either a character class again (—) or simply the disjunction (™).(p1 m1) (0 m2) = p1 m1 "(p1 m1) (p2 m2) = p1 (m1 ªD p2) if  p1 m2 = p1±BNFC3Match given characters.²BNFC3"Match any of the given characters.¹BNFC3Smart constructor for  CharClass from difference..Mutually reduce: (A - B) = (A B) - (B A)½BNFC3 Union of character class unions.4ˆŒ‹Š‰��Ž�‘“’”•–›˜—šž�œ™Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»4–›˜—šž�œ™¤£¢¥”•�‘“’¡ ��ŽŸˆŒ‹Š‰¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º» None#$%05679>?ÀÁÂÄÎÑÔÙàáèN^ÍBNFC3$Something that can be parsed into a Õ.ÏBNFC3$Something that can be parsed into a Ñ.ÓBNFC39Starting at line, counting from 1. (0 for invalid line.)ÔBNFC3=Starting at column, counting from 1. (0 for invalid column.)ÍÎÏÐÑÒÔÓÕÖ×ÙØÚÛÝÜÚÛÝÜÖ×ÙØÕÑÒÔÓÏÐÍÎNone#$%05679>?ÀÁÂÄÎÑÔÙàáèNüôBNFC3Target languages ôÿþýüûúùø÷öõ ôÿþýüûúùø÷öõNone#$%05679>?ÀÁÂÄÎÑÔÙàáèO¨…BNFC3Global options.�BNFC3Global options parser. …†Œ‹Š‰ˆ‡� …†Œ‹Š‰ˆ‡�None#$%05679>?ÀÁÂÄÎÑÔÙàáèP ��‘��‘None#$%05679>?ÀÁÂÄÎÑÔÙàáèQÈ’BNFC3$Create regex for multiline comments.*debugPrint $ mkRegMultilineComment "<" ">"'<'(char-'>')*'>',debugPrint $ mkRegMultilineComment "/*" "*/"9{"/*"}(char-'*')*'*'((char-["*/"])(char-'*')*'*'|'*')*'/'/debugPrint $ mkRegMultilineComment ""ã{"