1
1
import eyg/parse/token as t
2
- import gleam/bit_array
3
2
import gleam/list
4
3
import gleam/string
4
+ import gleam/stringx
5
5
6
6
pub fn lex ( raw ) {
7
7
loop ( raw , 0 , [ ] )
@@ -50,7 +50,7 @@ fn pop(raw, start) {
50
50
"shallow" <> rest -> done ( t . Shallow , 7 , rest )
51
51
"handle" <> rest -> done ( t . Handle , 6 , rest )
52
52
53
- "\" " <> rest -> string ( "" , rest , done )
53
+ "\" " <> rest -> string ( "" , 1 , rest , done )
54
54
55
55
"1" <> rest -> integer ( "1" , rest , done )
56
56
"2" <> rest -> integer ( "2" , rest , done )
@@ -63,63 +63,116 @@ fn pop(raw, start) {
63
63
"9" <> rest -> integer ( "9" , rest , done )
64
64
"0" <> rest -> integer ( "0" , rest , done )
65
65
_ -> {
66
- case string . pop_grapheme ( raw ) {
67
- Ok ( # ( g , rest ) ) ->
68
- case is_lower_grapheme ( g ) || g == "_" {
69
- True -> name ( g , rest , done )
70
- False ->
71
- case is_upper_grapheme ( g ) {
72
- True -> uppername ( g , rest , done )
73
- False -> done ( t . UnexpectedGrapheme ( g ) , byte_size ( g ) , rest )
74
- }
75
- }
76
- Error ( Nil ) -> Error ( Nil )
66
+ let next_byte = stringx . byte_slice_range ( raw , 0 , 1 )
67
+ let rest = stringx . byte_slice_from ( raw , 1 )
68
+ case next_byte {
69
+ "_"
70
+ | "a"
71
+ | "b"
72
+ | "c"
73
+ | "d"
74
+ | "e"
75
+ | "f"
76
+ | "g"
77
+ | "h"
78
+ | "i"
79
+ | "j"
80
+ | "k"
81
+ | "l"
82
+ | "m"
83
+ | "n"
84
+ | "o"
85
+ | "p"
86
+ | "q"
87
+ | "r"
88
+ | "s"
89
+ | "t"
90
+ | "u"
91
+ | "v"
92
+ | "w"
93
+ | "x"
94
+ | "y"
95
+ | "z" -> name ( next_byte , rest , done )
96
+ "A"
97
+ | "B"
98
+ | "C"
99
+ | "D"
100
+ | "E"
101
+ | "F"
102
+ | "G"
103
+ | "H"
104
+ | "I"
105
+ | "J"
106
+ | "K"
107
+ | "L"
108
+ | "M"
109
+ | "N"
110
+ | "O"
111
+ | "P"
112
+ | "Q"
113
+ | "R"
114
+ | "S"
115
+ | "T"
116
+ | "U"
117
+ | "V"
118
+ | "W"
119
+ | "X"
120
+ | "Y"
121
+ | "Z" -> uppername ( next_byte , rest , done )
122
+ "" -> Error ( Nil )
123
+ _ -> done ( t . UnexpectedGrapheme ( raw ) , string . byte_size ( raw ) , "" )
77
124
}
78
125
}
79
126
}
80
127
}
81
128
82
- fn string ( buffer , rest , done ) {
129
+ fn string ( buffer , length , rest , done ) {
83
130
case rest {
84
- "\" " <> rest -> done ( t . String ( buffer ) , byte_size ( buffer ) + 2 , rest )
131
+ "\" " <> rest -> done ( t . String ( buffer ) , length + 1 , rest )
85
132
"\\ " <> rest ->
86
- case string . pop_grapheme ( rest ) {
87
- Ok ( # ( g , rest ) ) -> string ( buffer <> "\\ " <> g , rest , done )
88
- Error ( Nil ) -> string ( buffer <> "\\ " , rest , done )
89
- }
90
- _ ->
91
- case string . pop_grapheme ( rest ) {
92
- Ok ( # ( g , rest ) ) -> string ( buffer <> g , rest , done )
93
- Error ( Nil ) ->
94
- done ( t . UnterminatedString ( buffer ) , byte_size ( buffer ) + 1 , "" )
133
+ case rest {
134
+ "\" " <> rest -> string ( buffer <> "\" " , length + 2 , rest , done )
135
+ "\\ " <> rest -> string ( buffer <> "\\ " , length + 2 , rest , done )
136
+ "t" <> rest -> string ( buffer <> "\t " , length + 2 , rest , done )
137
+ "r" <> rest -> string ( buffer <> "\r " , length + 2 , rest , done )
138
+ "n" <> rest -> string ( buffer <> "\n " , length + 2 , rest , done )
139
+ "" -> done ( t . UnterminatedString ( buffer <> "\\ " ) , length , "" )
140
+ _ -> todo as "invalid escape"
95
141
}
142
+ "" -> done ( t . UnterminatedString ( buffer ) , length , "" )
143
+ _ -> {
144
+ let next_byte = stringx . byte_slice_range ( rest , 0 , 1 )
145
+ let rest = stringx . byte_slice_from ( rest , 1 )
146
+ string ( buffer <> next_byte , length + 1 , rest , done )
147
+ }
96
148
}
97
149
}
98
150
99
151
fn name ( buffer , raw , done ) {
100
- case string . pop_grapheme ( raw ) {
101
- Ok ( # ( g , rest ) ) ->
102
- case is_lower_grapheme ( g ) || is_digit_grapheme ( g ) || g == "_" {
103
- True -> name ( buffer <> g , rest , done )
104
- False -> done ( t . Name ( buffer ) , byte_size ( buffer ) , raw )
105
- }
106
- Error ( Nil ) -> done ( t . Name ( buffer ) , byte_size ( buffer ) , raw )
152
+ let next_byte = stringx . byte_slice_range ( raw , 0 , 1 )
153
+ let rest = stringx . byte_slice_from ( raw , 1 )
154
+ case
155
+ is_lower_grapheme ( next_byte )
156
+ || is_digit_grapheme ( next_byte )
157
+ || next_byte == "_"
158
+ {
159
+ True -> name ( buffer <> next_byte , rest , done )
160
+ False -> done ( t . Name ( buffer ) , string . byte_size ( buffer ) , raw )
107
161
}
108
162
}
109
163
110
164
fn uppername ( buffer , raw , done ) {
111
- case string . pop_grapheme ( raw ) {
112
- Ok ( # ( g , rest ) ) ->
113
- case
114
- is_upper_grapheme ( g )
115
- || is_lower_grapheme ( g )
116
- || is_digit_grapheme ( g )
117
- || g == "_"
118
- {
119
- True -> uppername ( buffer <> g , rest , done )
120
- False -> done ( t . Uppername ( buffer ) , byte_size ( buffer ) , raw )
121
- }
122
- Error ( Nil ) -> done ( t . Uppername ( buffer ) , byte_size ( buffer ) , raw )
165
+ let next_byte = stringx . byte_slice_range ( raw , 0 , 1 )
166
+ let rest = stringx . byte_slice_from ( raw , 1 )
167
+
168
+ case
169
+ is_upper_grapheme ( next_byte )
170
+ || is_lower_grapheme ( next_byte )
171
+ || is_digit_grapheme ( next_byte )
172
+ || next_byte == "_"
173
+ {
174
+ True -> uppername ( buffer <> next_byte , rest , done )
175
+ False -> done ( t . Uppername ( buffer ) , string . byte_size ( buffer ) , raw )
123
176
}
124
177
}
125
178
@@ -135,14 +188,10 @@ fn integer(buffer, rest, done) {
135
188
"8" <> rest -> integer ( buffer <> "8" , rest , done )
136
189
"9" <> rest -> integer ( buffer <> "9" , rest , done )
137
190
"0" <> rest -> integer ( buffer <> "0" , rest , done )
138
- _ -> done ( t . Integer ( buffer ) , byte_size ( buffer ) , rest )
191
+ _ -> done ( t . Integer ( buffer ) , string . byte_size ( buffer ) , rest )
139
192
}
140
193
}
141
194
142
- fn byte_size ( string : String ) -> Int {
143
- bit_array . byte_size ( << string : utf8 >> )
144
- }
145
-
146
195
fn is_lower_grapheme ( grapheme ) {
147
196
case grapheme {
148
197
"a"
0 commit comments