@@ -116,6 +116,8 @@ func (l *lexer) next() (*Token, error) {
116
116
default :
117
117
return newToken (start , l .pos , GreaterThan , ">" ), nil
118
118
}
119
+ case '#' :
120
+ return l .errValue ()
119
121
default :
120
122
if isDigit (l .ch ) {
121
123
return l .number ()
@@ -150,6 +152,12 @@ func (l *lexer) nextch() {
150
152
}
151
153
}
152
154
155
+ func (l * lexer ) eat (n int ) {
156
+ for i := 0 ; i < n ; i ++ {
157
+ l .nextch ()
158
+ }
159
+ }
160
+
153
161
func (l * lexer ) absoluteReference () (* Token , error ) {
154
162
var start = l .pos
155
163
var startOffset = l .offset - 1 // Start at the current character
@@ -205,6 +213,33 @@ func (l *lexer) absoluteReference() (*Token, error) {
205
213
return nil , newLexError (l .pos , "invalid absolute reference after '$'" )
206
214
}
207
215
216
+ func (l * lexer ) errValue () (* Token , error ) {
217
+ var values = []string {
218
+ "#NULL!" ,
219
+ "#DIV/0!" ,
220
+ "#VALUE!" ,
221
+ "#REF!" ,
222
+ "#NAME?" ,
223
+ "#NUM!" ,
224
+ "#N/A" ,
225
+ }
226
+ for _ , value := range values {
227
+ // check length
228
+ if l .offset - 1 + len (value ) > len (l .src ) {
229
+ continue // Not enough characters left for this error value
230
+ }
231
+ if string (l .src [l .offset - 1 :l .offset - 1 + len (value )]) == value {
232
+ var start = l .pos
233
+ l .eat (len (value ) - 1 ) // Consume the error value
234
+ var end = l .pos
235
+ l .offset += len (value ) - 1 // Adjust offset to skip the error value
236
+ l .ch = l .peekChar () // Update current character
237
+ return newToken (start , end , EValue , value ), nil
238
+ }
239
+ }
240
+ return nil , newLexError (l .pos , "unrecognized error value" )
241
+ }
242
+
208
243
func (l * lexer ) stringLiteral (quote rune ) (* Token , error ) {
209
244
var start = l .pos
210
245
var end = start
0 commit comments