@@ -340,16 +340,8 @@ varPrim isGoodFirstChar =
340 (# newOffset, newLength, newCol #) =
340 (# newOffset, newLength, newCol #) =
341 varPrimHelp array (offset + size) (length - size) (col + 1)
341 varPrimHelp array (offset + size) (length - size) (col + 1)
347− do mutableArray <- Text.new newSize
348− Text.copyI mutableArray 0 array offset newSize
351 copiedText =
343 copiedText =
352− Text.Text (Text.run makeArray) 0 newSize
344+ copyText array offset (newOffset - offset)
354 if Set.member copiedText keywords then
346 if Set.member copiedText keywords then
355 eerr (loneTheory row newCol Variable)
347 eerr (loneTheory row newCol Variable)
@@ -360,6 +352,18 @@ varPrim isGoodFirstChar =
360 eerr (loneTheory row col Variable)
352 eerr (loneTheory row col Variable)
355+{-# INLINE copyText #-}
356+copyText :: Text.Array -> Int -> Int -> Text.Text
357+copyText array offset size =
360+ do mutableArray <- Text.new size
361+ Text.copyI mutableArray 0 array offset size
364+ Text.Text (Text.run makeArray) 0 size
363{-# INLINE peek #-}
367{-# INLINE peek #-}
364peek :: Text.Array -> Int -> Text.Iter
368peek :: Text.Array -> Int -> Text.Iter
365peek array offset =
369peek array offset =
@@ -428,22 +432,13 @@ infixOp =
430 Right ( newOffset, newLength, newCol ) ->
434 Right ( newOffset, newLength, newCol ) ->
431− let
435+ case copyText array offset (newOffset - offset) of
436− do mutableArray <- Text.new newSize
437− Text.copyI mutableArray 0 array offset newSize
440− case Text.Text (Text.run makeArray) 0 newSize of
441− "=" -> cerr (ParseError row col Dot)
436+ "=" -> cerr (ParseError row col Dot)
442− "|" -> cerr (ParseError row col Pipe)
437+ "|" -> cerr (ParseError row col Pipe)
443− ":" -> cerr (ParseError row col Arrow)
438+ ":" -> cerr (ParseError row col Arrow)
444− "." -> cerr (ParseError row col Equals)
439+ "." -> cerr (ParseError row col Equals)
445− "->" -> cerr (ParseError row col HasType)
440+ "->" -> cerr (ParseError row col HasType)
446− op -> cok op (State array newOffset newLength indent row newCol)
441+ op -> cok op (State array newOffset newLength indent row newCol)
449infixOpHelp :: Text.Array -> Int -> Int -> Int -> Int -> Either ParseError (Int, Int, Int)
444infixOpHelp :: Text.Array -> Int -> Int -> Int -> Int -> Either ParseError (Int, Int, Int)
@@ -645,19 +640,9 @@ docComment =
647 Right (newOffset, newLength, newRow, newCol) ->
642 Right (newOffset, newLength, newRow, newCol) ->
650− newOffset - offset
644+ (copyText array offset (newOffset - offset))
653− do mutableArray <- Text.new newSize
654− Text.copyI mutableArray 0 array offset newSize
658− Text.Text (Text.run makeArray) 0 newSize
660− cok comment (State array newOffset newLength indent newRow newCol)
645+ (State array newOffset newLength indent newRow newCol)
@@ -739,13 +724,8 @@ singleString array offset length row col initialOffset builder =
739 Left err ->
724 Left err ->
742− Right ( size, char ) ->
727+ Right size ->
744− !newOffset = offset + size
745− chunk = Text.Text array initialOffset (offset - initialOffset)
746− newBuilder = builder <> LB.fromText chunk <> LB.singleton char
748− singleString array newOffset (length - size) row (col + size) newOffset newBuilder
728+ singleString array (offset + size) (length - size) row (col + size) initialOffset builder
750 else if word < 0xD800 || word > 0xDBFF then
730 else if word < 0xD800 || word > 0xDBFF then
751 singleString array (offset + 1) (length - 1) row (col + 1) initialOffset builder
731 singleString array (offset + 1) (length - 1) row (col + 1) initialOffset builder
@@ -754,58 +734,34 @@ singleString array offset length row col initialOffset builder =
754 singleString array (offset + 2) (length - 2) row (col + 1) initialOffset builder
734 singleString array (offset + 2) (length - 2) row (col + 1) initialOffset builder
757−eatEscape :: Text.Array -> Int -> Int -> Int -> Int -> Problem -> Either ParseError ( Int, Char )
737+eatEscape :: Text.Array -> Int -> Int -> Int -> Int -> Problem -> Either ParseError Int
758eatEscape array offset length row col problem =
738eatEscape array offset length row col problem =
759 if length == 0 then
739 if length == 0 then
760 Left (ParseError row col problem)
740 Left (ParseError row col problem)
763 case Text.unsafeIndex array offset of
743 case Text.unsafeIndex array offset of
764− 0x0061 {- a -} -> Right ( 2, '\a' )
744+ 0x0061 {- a -} -> Right 2
765− 0x0062 {- b -} -> Right ( 2, '\b' )
745+ 0x0062 {- b -} -> Right 2
766− 0x0066 {- f -} -> Right ( 2, '\f' )
746+ 0x0066 {- f -} -> Right 2
767− 0x006E {- n -} -> Right ( 2, '\n' )
747+ 0x006E {- n -} -> Right 2
768− 0x0072 {- r -} -> Right ( 2, '\r' )
748+ 0x0072 {- r -} -> Right 2
769− 0x0074 {- t -} -> Right ( 2, '\t' )
749+ 0x0074 {- t -} -> Right 2
770− 0x0076 {- v -} -> Right ( 2, '\v' )
750+ 0x0076 {- v -} -> Right 2
771− 0x0022 {- " -} -> Right ( 2, '\"' )
751+ 0x0022 {- " -} -> Right 2
772− 0x005C {- \ -} -> Right ( 2, '\\' )
752+ 0x005C {- \ -} -> Right 2
773− 0x0027 {- ' -} -> Right ( 2, '\'' )
753+ 0x0027 {- ' -} -> Right 2
774− 0x0078 {- x -} ->
754+ 0x0075 {- u -} | length >= 5 && fourHex array offset -> Right 6
775− case eatHex array (offset + 1) (length - 1) 0 of
777− Left (ParseError row col BadEscape)
779− Just (newOffset, code) ->
780− if code <= 0x10FFFF then
781− Right ( 1 + (newOffset - offset), toEnum (fromInteger code) )
783− Left (ParseError row col BadEscape)
786 Left (ParseError row col BadEscape)
756 Left (ParseError row col BadEscape)
789−eatHex :: Text.Array -> Int -> Int -> Integer -> Maybe ( Int, Integer )
759+fourHex :: Text.Array -> Int -> Bool
790−eatHex array offset length n =
760+fourHex array offset =
791− if length < 3 then
761+ isHex (Text.unsafeIndex array (offset + 1))
792− Nothing
762+ && isHex (Text.unsafeIndex array (offset + 2))
793−
763+ && isHex (Text.unsafeIndex array (offset + 3))
796− !word = Text.unsafeIndex array offset
764+ && isHex (Text.unsafeIndex array (offset + 4))
798− if 0x0030 <= word && word <= 0x0039 then
799− eatHex array (offset + 1) (length - 1) (16 * n + fromIntegral (word - 0x0030))
801− else if 0x0061 <= word && word <= 0x0066 then
802− eatHex array (offset + 1) (length - 1) (16 * n + 10 + fromIntegral (word - 0x0061))
804− else if 0x0041 <= word && word <= 0x0046 then
805− eatHex array (offset + 1) (length - 1) (16 * n + 10 + fromIntegral (word - 0x0041))
@@ -854,13 +810,8 @@ multiString array offset length row col initialOffset builder =
854 Left err ->
810 Left err ->
857− Right ( size, char ) ->
813+ Right size ->
859− !newOffset = offset + size
860− chunk = Text.Text array initialOffset (offset - initialOffset)
861− newBuilder = builder <> LB.fromText chunk <> LB.singleton char
863− multiString array newOffset (length - size) row (col + size) newOffset newBuilder
814+ multiString array (offset + size) (length - size) row (col + size) initialOffset builder
865 else if word < 0xD800 || word > 0xDBFF then
816 else if word < 0xD800 || word > 0xDBFF then
866 multiString array (offset + 1) (length - 1) row (col + 1) initialOffset builder
817 multiString array (offset + 1) (length - 1) row (col + 1) initialOffset builder
@@ -873,7 +824,7 @@ multiString array offset length row col initialOffset builder =
873-- CHARACTER
824-- CHARACTER
876−character :: Parser Char
827+character :: Parser Text
877character =
828character =
878 Parser $ \(State array offset length indent row col) cok cerr _ eerr ->
829 Parser $ \(State array offset length indent row col) cok cerr _ eerr ->
879 if length == 0 then
830 if length == 0 then
@@ -891,40 +842,37 @@ character =
891 Left err ->
842 Left err ->
894− Right ( size, char ) ->
845+ Right (endCol, size) ->
896 !newOffset = offset + size + 1
847 !newOffset = offset + size + 1
897 !newLength = length - size - 1
848 !newLength = length - size - 1
899− if newLength == 0 then
850+ if newLength == 0 || Text.unsafeIndex array newOffset /= 0x0027 {- ' -} then
900 cerr (ParseError row col BadChar)
851 cerr (ParseError row col BadChar)
902− else if Text.unsafeIndex array newOffset == 0x0027 {- ' -} then
903− cok char (State array (newOffset + 1) (newLength - 1) indent row (col + size + 2))
906− cerr (ParseError row col BadChar)
854+ cok
855+ (copyText array (offset + 1) size)
856+ (State array (newOffset + 1) (newLength - 1) indent row endCol)
909−characterHelp :: Text.Array -> Int -> Int -> Int -> Int -> Either ParseError ( Int, Char )
859+characterHelp :: Text.Array -> Int -> Int -> Int -> Int -> Either ParseError ( Int, Int )
910characterHelp array offset length row col =
860characterHelp array offset length row col =
912 !word = Text.unsafeIndex array offset
862 !word = Text.unsafeIndex array offset
914− if word == 0x0027 {- ' -} then
864+ if word == 0x0027 {- ' -} || word == 0x000A {- \n -} then
915 Left (ParseError row col BadChar)
865 Left (ParseError row col BadChar)
917 else if word == 0x005C {- \ -} then
867 else if word == 0x005C {- \ -} then
918− eatEscape array (offset + 1) (length - 1) row (col + 1) BadChar
868+ do n <- eatEscape array (offset + 1) (length - 1) row (col + 1) BadChar
919−
869+ return (col + n + 2, n)
920− else if word == 0x000A {- \n -} then
921− Left (ParseError row col BadChar)
923 else if word < 0xD800 || word > 0xDBFF then
871 else if word < 0xD800 || word > 0xDBFF then
924− Right (1, unsafeChr word)
872+ Right (col + 3, 1)
926 else if length > 2 then
874 else if length > 2 then
927− Right (2, chr2 word (Text.unsafeIndex array offset))
875+ Right (col + 3, 2)
930 Left (ParseError row col BadChar)
878 Left (ParseError row col BadChar)