@@ -116,6 +116,8 @@ func (l *lexer) next() (*Token, error) {
116116		default :
117117			return  newToken (start , l .pos , GreaterThan , ">" ), nil 
118118		}
119+ 	case  '#' :
120+ 		return  l .errValue ()
119121	default :
120122		if  isDigit (l .ch ) {
121123			return  l .number ()
@@ -150,6 +152,12 @@ func (l *lexer) nextch() {
150152	}
151153}
152154
155+ func  (l  * lexer ) eat (n  int ) {
156+ 	for  i  :=  0 ; i  <  n ; i ++  {
157+ 		l .nextch ()
158+ 	}
159+ }
160+ 
153161func  (l  * lexer ) absoluteReference () (* Token , error ) {
154162	var  start  =  l .pos 
155163	var  startOffset  =  l .offset  -  1  // Start at the current character 
@@ -205,6 +213,33 @@ func (l *lexer) absoluteReference() (*Token, error) {
205213	return  nil , newLexError (l .pos , "invalid absolute reference after '$'" )
206214}
207215
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+ 
208243func  (l  * lexer ) stringLiteral (quote  rune ) (* Token , error ) {
209244	var  start  =  l .pos 
210245	var  end  =  start 
0 commit comments