@@ -32,67 +32,68 @@ func (l *lexer) next() (*Token, error) {
3232 for l .ch == ' ' || l .ch == '\n' || l .ch == '\t' {
3333 l .nextch ()
3434 }
35+ var start = l .pos
3536 switch l .ch {
3637 case '"' :
3738 return l .stringLiteral (l .ch )
3839 case '\'' :
3940 return l .stringLiteral (l .ch )
4041 case '=' :
4142 l .nextch ()
42- return newToken (l . pos , l . pos , Equal , "=" ), nil
43+ return newToken (start , start , Equal , "=" ), nil
4344 case '!' :
4445 l .nextch ()
45- return newToken (l . pos , l . pos , Exclamation , "!" ), nil
46+ return newToken (start , start , Exclamation , "!" ), nil
4647 case ',' :
4748 l .nextch ()
48- return newToken (l . pos , l . pos , Comma , "," ), nil
49+ return newToken (start , start , Comma , "," ), nil
4950 case '(' :
5051 l .nextch ()
51- return newToken (l . pos , l . pos , ParenOpen , "(" ), nil
52+ return newToken (start , start , ParenOpen , "(" ), nil
5253 case ')' :
5354 l .nextch ()
54- return newToken (l . pos , l . pos , ParenClose , ")" ), nil
55+ return newToken (start , start , ParenClose , ")" ), nil
5556 case '{' :
5657 l .nextch ()
57- return newToken (l . pos , l . pos , BraceOpen , "{" ), nil
58+ return newToken (start , start , BraceOpen , "{" ), nil
5859 case '}' :
5960 l .nextch ()
60- return newToken (l . pos , l . pos , BraceClose , "}" ), nil
61+ return newToken (start , start , BraceClose , "}" ), nil
6162 case '[' :
6263 l .nextch ()
63- return newToken (l . pos , l . pos , BracketOpen , "[" ), nil
64+ return newToken (start , start , BracketOpen , "[" ), nil
6465 case ']' :
6566 l .nextch ()
66- return newToken (l . pos , l . pos , BracketClose , "]" ), nil
67+ return newToken (start , start , BracketClose , "]" ), nil
6768 case ':' :
6869 l .nextch ()
69- return newToken (l . pos , l . pos , Colon , ":" ), nil
70+ return newToken (start , start , Colon , ":" ), nil
7071 case ';' :
7172 l .nextch ()
72- return newToken (l . pos , l . pos , Semicolon , ";" ), nil
73+ return newToken (start , start , Semicolon , ";" ), nil
7374 case '+' :
7475 l .nextch ()
75- return newToken (l . pos , l . pos , Plus , "+" ), nil
76+ return newToken (start , start , Plus , "+" ), nil
7677 case '-' :
7778 l .nextch ()
78- return newToken (l . pos , l . pos , Minus , "-" ), nil
79+ return newToken (start , start , Minus , "-" ), nil
7980 case '*' :
8081 l .nextch ()
81- return newToken (l . pos , l . pos , Multiply , "*" ), nil
82+ return newToken (start , start , Multiply , "*" ), nil
8283 case '/' :
8384 l .nextch ()
84- return newToken (l . pos , l . pos , Divide , "/" ), nil
85+ return newToken (start , start , Divide , "/" ), nil
8586 case '$' :
8687 return l .absoluteReference ()
8788 case '&' :
8889 l .nextch ()
89- return newToken (l . pos , l . pos , Concat , "&" ), nil
90+ return newToken (start , start , Concat , "&" ), nil
9091 case '^' :
9192 l .nextch ()
92- return newToken (l . pos , l . pos , Exponentiation , "^" ), nil
93+ return newToken (start , start , Exponentiation , "^" ), nil
9394 case '%' :
9495 l .nextch ()
95- return newToken (l . pos , l . pos , Percent , "%" ), nil
96+ return newToken (start , start , Percent , "%" ), nil
9697 case '<' :
9798 var start = l .pos
9899 l .nextch ()
@@ -118,6 +119,9 @@ func (l *lexer) next() (*Token, error) {
118119 }
119120 case '#' :
120121 return l .errValue ()
122+ case '@' :
123+ l .nextch ()
124+ return newToken (start , start , ImplicitIntersection , "@" ), nil
121125 default :
122126 if isDigit (l .ch ) {
123127 return l .number ()
@@ -224,16 +228,15 @@ func (l *lexer) errValue() (*Token, error) {
224228 "#N/A" ,
225229 }
226230 for _ , value := range values {
231+ _len := utf8 .RuneCountInString (value )
227232 // check length
228- if l .offset - 1 + len ( value ) > len (l .src ) {
233+ if l .offset - 1 + _len > len (l .src ) {
229234 continue // Not enough characters left for this error value
230235 }
231- if string (l .src [l .offset - 1 :l .offset - 1 + len ( value ) ]) == value {
236+ if string (l .src [l .offset - 1 :l .offset - 1 + _len ]) == value {
232237 var start = l .pos
233- l .eat (len ( value ) - 1 ) // Consume the error value
238+ l .eat (_len ) // Consume the error value
234239 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
237240 return newToken (start , end , EValue , value ), nil
238241 }
239242 }
@@ -244,25 +247,21 @@ func (l *lexer) stringLiteral(quote rune) (*Token, error) {
244247 var start = l .pos
245248 var end = start
246249 l .nextch () // Consume the opening quote
247- for l .ch != quote && l . ch >= 0 {
250+ for l .ch >= 0 {
248251 if l .ch == '\n' {
249252 return nil , newLexError (l .pos , "newline in string literal" )
250253 }
251- if l .ch == '\\' {
252- l .nextch ()
253- switch {
254- case l .ch < 0 :
255- return nil , newLexError (l .pos , "unclosed string literal" )
256- case l .ch == quote || l .ch == '\\' :
257- // Consume the escaped character
258- default :
259- return nil , newLexError (l .pos , "invalid escape sequence in string literal" )
254+ if l .ch == quote {
255+ if l .peekChar () == quote {
256+ l .nextch ()
257+ } else {
258+ break
260259 }
261260 }
262261 end = l .pos
263262 l .nextch ()
264263 }
265- if l .ch < 0 {
264+ if l .ch != quote {
266265 return nil , newLexError (l .pos , "unclosed string literal" )
267266 }
268267 end = l .pos // Update end to the position after the closing quote
@@ -315,7 +314,7 @@ func (l *lexer) ident() (*Token, error) {
315314LOOP:
316315 for l .ch >= 0 {
317316 switch {
318- case isASCIILetter (l .ch ) || isDigit (l .ch ):
317+ case isASCIILetter (l .ch ) || isDigit (l .ch ) || l . ch == '.' :
319318 end = l .pos
320319 endOffset = l .offset
321320 l .nextch ()
0 commit comments