@@ -945,7 +945,7 @@ module ParseUnparse
945
945
end
946
946
end
947
947
module LexingUtil
948
- export TokenIteratorState, token_iterator_state_init, lexer_state_new, lexer_state_get_extra, lexer_state_get_consumed_character_count, lexer_state_destroy!, lexer_state_peek!, lexer_state_consume!
948
+ export TokenIteratorState, token_iterator_state_init, lexer_state_simple_new, lexer_state_new, lexer_state_get_extra, lexer_state_get_consumed_character_count, lexer_state_destroy!, lexer_state_peek!, lexer_state_consume!
949
949
using .. Optionals
950
950
const TokenIteratorStateOpaque = Tuple{
951
951
Int64, IOBuffer, Optional{Character}, OptionalCharacterIteratorState,
@@ -964,6 +964,30 @@ module ParseUnparse
964
964
opaque,
965
965
)
966
966
end
967
+ mutable struct LexerStateSimple{Character, CharacterIterator, CharacterIteratorState}
968
+ optional_most_recently_read_character:: Optional{Character}
969
+ const character_iterator:: CharacterIterator
970
+ """
971
+ * If empty, the input is exhausted.
972
+
973
+ * Assuming the character iterator state type stays the same after each iteration!
974
+ """
975
+ optional_character_iterator_state:: Optional{CharacterIteratorState}
976
+ function LexerStateSimple (oc:: AbstractVector , it, os:: AbstractVector )
977
+ new {eltype(oc), typeof(it), eltype(os)} (oc, it, os)
978
+ end
979
+ end
980
+ function lexer_state_simple_new (character_iterator)
981
+ iter = iterate (character_iterator)
982
+ if iter === nothing
983
+ ()
984
+ else
985
+ ls = let (e, s) = iter
986
+ LexerStateSimple (Optional (e), character_iterator, Optional (s))
987
+ end
988
+ (ls,)
989
+ end
990
+ end
967
991
mutable struct LexerState{Character, CharacterIterator, CharacterIteratorState, Extra}
968
992
optional_most_recently_read_character:: Optional{Character}
969
993
const character_iterator:: CharacterIterator
@@ -1005,13 +1029,13 @@ module ParseUnparse
1005
1029
function lexer_state_get_extra (lexer_state:: LexerState )
1006
1030
lexer_state. extra
1007
1031
end
1008
- function lexer_state_is_empty (lexer_state:: LexerState )
1032
+ function lexer_state_is_empty (lexer_state:: Union{LexerStateSimple, LexerState} )
1009
1033
isempty (lexer_state. optional_most_recently_read_character)
1010
1034
end
1011
- function lexer_state_destroy_most_recently_read_character! (lexer_state:: LexerState )
1035
+ function lexer_state_destroy_most_recently_read_character! (lexer_state:: Union{LexerStateSimple, LexerState} )
1012
1036
lexer_state. optional_most_recently_read_character = typeof (lexer_state. optional_most_recently_read_character)()
1013
1037
end
1014
- function lexer_state_advance! (lexer_state:: LexerState )
1038
+ function lexer_state_advance! (lexer_state:: Union{LexerStateSimple, LexerState} )
1015
1039
optional_state = lexer_state. optional_character_iterator_state
1016
1040
C = typeof (lexer_state. optional_most_recently_read_character)
1017
1041
S = typeof (optional_state)
@@ -1024,7 +1048,9 @@ module ParseUnparse
1024
1048
lexer_state_destroy_most_recently_read_character! (lexer_state)
1025
1049
lexer_state. optional_character_iterator_state = S ()
1026
1050
else
1027
- lexer_state. read_character_count += true
1051
+ if lexer_state isa LexerState
1052
+ lexer_state. read_character_count += true
1053
+ end
1028
1054
let (c, s) = iter
1029
1055
lexer_state. optional_most_recently_read_character = C (c)
1030
1056
lexer_state. optional_character_iterator_state = S (s)
@@ -1049,21 +1075,21 @@ module ParseUnparse
1049
1075
token_source = take! (buffer)
1050
1076
(; opaque, token_source)
1051
1077
end
1052
- function lexer_state_advance_if_possible! (lexer_state:: LexerState )
1078
+ function lexer_state_advance_if_possible! (lexer_state:: Union{LexerStateSimple, LexerState} )
1053
1079
if lexer_state_is_empty (lexer_state)
1054
1080
lexer_state_advance! (lexer_state)
1055
1081
lexer_state_is_empty (lexer_state)
1056
1082
else
1057
1083
false
1058
1084
end
1059
1085
end
1060
- function lexer_state_peek! (lexer_state:: LexerState )
1086
+ function lexer_state_peek! (lexer_state:: Union{LexerStateSimple, LexerState} )
1061
1087
lexer_state_advance_if_possible! (lexer_state)
1062
1088
lexer_state. optional_most_recently_read_character
1063
1089
end
1064
- function lexer_state_consume! (lexer_state:: LexerState )
1090
+ function lexer_state_consume! (lexer_state:: Union{LexerStateSimple, LexerState} )
1065
1091
oc = lexer_state_peek! (lexer_state)
1066
- if ! isempty (oc)
1092
+ if (lexer_state isa LexerState) && ! isempty (oc)
1067
1093
print (lexer_state. buffer, only (oc))
1068
1094
end
1069
1095
lexer_state_destroy_most_recently_read_character! (lexer_state)
0 commit comments