@@ -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_RAWCOPEN = 67
208209
209210let s: MAX_FUNC_ARGS = 20
210211
@@ -2754,8 +2755,13 @@ function! s:ExprTokenizer.get2()
27542755 call r .seek_cur (1 )
27552756 return self .token (s: TOKEN_COLON , ' :' , pos)
27562757 elseif c == # ' #'
2757- call r .seek_cur (1 )
2758- return self .token (s: TOKEN_SHARP , ' #' , pos)
2758+ if r .p (1 ) == # ' {'
2759+ call r .seek_cur (2 )
2760+ return self .token (s: TOKEN_RAWCOPEN , ' #{' , pos)
2761+ else
2762+ call r .seek_cur (2 )
2763+ return self .token (s: TOKEN_SHARP , ' #' , pos)
2764+ endif
27592765 elseif c == # ' ('
27602766 call r .seek_cur (1 )
27612767 return self .token (s: TOKEN_POPEN , ' (' , pos)
@@ -2875,6 +2881,29 @@ function! s:ExprTokenizer.get_dstring()
28752881 return s
28762882endfunction
28772883
2884+ function ! s: ExprTokenizer .get_dict_literal_key ()
2885+ call self .reader.skip_white ()
2886+ let r = self .reader
2887+ let c = r .peek ()
2888+ if ! s: isalnum (c ) && c != ' _' && c != ' -'
2889+ throw s: Err (printf (' unexpected token: %s' , token.value), token.pos)
2890+ endif
2891+ let s = c
2892+ call self .reader.seek_cur (1 )
2893+ while s: TRUE
2894+ let c = self .reader.p (0 )
2895+ if c == # ' <EOF>' || c == # ' <EOL>'
2896+ throw s: Err (' unexpectd EOL' , self .reader.getpos ())
2897+ endif
2898+ if ! s: isalnum (c ) && c != ' _' && c != ' -'
2899+ break
2900+ endif
2901+ call self .reader.seek_cur (1 )
2902+ let s .= c
2903+ endwhile
2904+ return s
2905+ endfunction
2906+
28782907let s: ExprParser = {}
28792908
28802909function ! s: ExprParser .new (... )
@@ -3363,6 +3392,7 @@ endfunction
33633392" 'string'
33643393" [expr1, ...]
33653394" {expr1: expr1, ...}
3395+ " #{literal_key1: expr1, ...}
33663396" {args -> expr1}
33673397" &option
33683398" (expr1)
@@ -3419,7 +3449,8 @@ function! s:ExprParser.parse_expr9()
34193449 endif
34203450 endwhile
34213451 endif
3422- elseif token.type == s: TOKEN_COPEN
3452+ elseif token.type == s: TOKEN_COPEN || token.type == s: TOKEN_RAWCOPEN
3453+ let is_rawdict = token.type == s: TOKEN_RAWCOPEN
34233454 let savepos = self .reader.tell ()
34243455 let nodepos = token.pos
34253456 let token = self .tokenizer.get ()
@@ -3507,7 +3538,7 @@ function! s:ExprParser.parse_expr9()
35073538 return node
35083539 endif
35093540 while 1
3510- let key = self .parse_expr1 ()
3541+ let key = is_rawdict ? self . parse_dict_literal_key () : self .parse_expr1 ()
35113542 let token = self .tokenizer.get ()
35123543 if token.type == s: TOKEN_CCLOSE
35133544 if ! empty (node.value)
@@ -3572,6 +3603,13 @@ function! s:ExprParser.parse_expr9()
35723603 return node
35733604endfunction
35743605
3606+ function ! s: ExprParser .parse_dict_literal_key ()
3607+ let node = s: Node (s: NODE_STRING )
3608+ let node.pos = self .reader.tell ()
3609+ let node.value = " '" . self .tokenizer.get_dict_literal_key () . " '"
3610+ return node
3611+ endfunction
3612+
35753613" SUBSCRIPT or CONCAT
35763614" dict "." [0-9A-Za-z_]+ => (subscript dict key)
35773615" str "." expr6 => (concat str expr6)
0 commit comments