@@ -205,6 +205,7 @@ let s:TOKEN_DOTDOTDOT = 63
205205let s: TOKEN_SHARP = 64
206206let s: TOKEN_ARROW = 65
207207let s: TOKEN_BLOB = 66
208+ let s: TOKEN_DOTDOT = 67
208209
209210let s: MAX_FUNC_ARGS = 20
210211
@@ -2731,9 +2732,12 @@ function! s:ExprTokenizer.get2()
27312732 if r .p (1 ) == # ' .' && r .p (2 ) == # ' .'
27322733 call r .seek_cur (3 )
27332734 return self .token (s: TOKEN_DOTDOTDOT , ' ...' , pos)
2735+ elseif r .p (1 ) == # ' .'
2736+ call r .seek_cur (2 )
2737+ return self .token (s: TOKEN_DOTDOT , ' ..' , pos) " TODO check scriptversion?
27342738 else
27352739 call r .seek_cur (1 )
2736- return self .token (s: TOKEN_DOT , ' .' , pos)
2740+ return self .token (s: TOKEN_DOT , ' .' , pos) " TODO check scriptversion?
27372741 endif
27382742 elseif c == # ' *'
27392743 call r .seek_cur (1 )
@@ -3162,6 +3166,7 @@ endfunction
31623166" expr5: expr6 + expr6 ..
31633167" expr6 - expr6 ..
31643168" expr6 . expr6 ..
3169+ " expr6 .. expr6 ..
31653170function ! s: ExprParser .parse_expr5 ()
31663171 let left = self .parse_expr6 ()
31673172 while s: TRUE
@@ -3179,7 +3184,13 @@ function! s:ExprParser.parse_expr5()
31793184 let node.left = left
31803185 let node.right = self .parse_expr6 ()
31813186 let left = node
3182- elseif token.type == s: TOKEN_DOT
3187+ elseif token.type == s: TOKEN_DOTDOT " TODO check scriptversion?
3188+ let node = s: Node (s: NODE_CONCAT )
3189+ let node.pos = token.pos
3190+ let node.left = left
3191+ let node.right = self .parse_expr6 ()
3192+ let left = node
3193+ elseif token.type == s: TOKEN_DOT " TODO check scriptversion?
31833194 let node = s: Node (s: NODE_CONCAT )
31843195 let node.pos = token.pos
31853196 let node.left = left
@@ -3342,7 +3353,7 @@ function! s:ExprParser.parse_expr8()
33423353 endif
33433354 let left = node
33443355 unlet node
3345- elseif ! s: iswhite (c ) && token.type == s: TOKEN_DOT
3356+ elseif ! s: iswhite (c ) && token.type == s: TOKEN_DOT " TODO check scriptversion?
33463357 let node = self .parse_dot (token, left )
33473358 if node is s: NIL
33483359 call self .reader.seek_set (pos)
@@ -3598,6 +3609,31 @@ function! s:ExprParser.parse_dot(token, left)
35983609 return node
35993610endfunction
36003611
3612+ " CONCAT
3613+ " str ".." expr6 => (concat str expr6)
3614+ function ! s: ExprParser .parse_concat (token, left )
3615+ if a: left .type != s: NODE_IDENTIFIER && a: left .type != s: NODE_CURLYNAME && a: left .type != s: NODE_DICT && a: left .type != s: NODE_SUBSCRIPT && a: left .type != s: NODE_CALL && a: left .type != s: NODE_DOT
3616+ return s: NIL
3617+ endif
3618+ if ! s: iswordc (self .reader.p (0 ))
3619+ return s: NIL
3620+ endif
3621+ let pos = self .reader.getpos ()
3622+ let name = self .reader.read_word ()
3623+ if s: isnamec (self .reader.p (0 ))
3624+ " XXX: foo is str => ok, foo is obj => invalid expression
3625+ " foo.s:bar or foo.bar#baz
3626+ return s: NIL
3627+ endif
3628+ let node = s: Node (s: NODE_CONCAT )
3629+ let node.pos = a: token .pos
3630+ let node.left = a: left
3631+ let node.right = s: Node (s: NODE_IDENTIFIER )
3632+ let node.right .pos = pos
3633+ let node.right .value = name
3634+ return node
3635+ endfunction
3636+
36013637function ! s: ExprParser .parse_identifier ()
36023638 call self .reader.skip_white ()
36033639 let npos = self .reader.getpos ()
0 commit comments