@@ -205,6 +205,7 @@ let s:TOKEN_DOTDOTDOT = 63
205
205
let s: TOKEN_SHARP = 64
206
206
let s: TOKEN_ARROW = 65
207
207
let s: TOKEN_BLOB = 66
208
+ let s: TOKEN_RAWCOPEN = 67
208
209
209
210
let s: MAX_FUNC_ARGS = 20
210
211
@@ -2754,8 +2755,13 @@ function! s:ExprTokenizer.get2()
2754
2755
call r .seek_cur (1 )
2755
2756
return self .token (s: TOKEN_COLON , ' :' , pos)
2756
2757
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
2759
2765
elseif c == # ' ('
2760
2766
call r .seek_cur (1 )
2761
2767
return self .token (s: TOKEN_POPEN , ' (' , pos)
@@ -2875,6 +2881,29 @@ function! s:ExprTokenizer.get_dstring()
2875
2881
return s
2876
2882
endfunction
2877
2883
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
+
2878
2907
let s: ExprParser = {}
2879
2908
2880
2909
function ! s: ExprParser .new (... )
@@ -3363,6 +3392,7 @@ endfunction
3363
3392
" 'string'
3364
3393
" [expr1, ...]
3365
3394
" {expr1: expr1, ...}
3395
+ " #{literal_key1: expr1, ...}
3366
3396
" {args -> expr1}
3367
3397
" &option
3368
3398
" (expr1)
@@ -3419,7 +3449,8 @@ function! s:ExprParser.parse_expr9()
3419
3449
endif
3420
3450
endwhile
3421
3451
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
3423
3454
let savepos = self .reader.tell ()
3424
3455
let nodepos = token.pos
3425
3456
let token = self .tokenizer.get ()
@@ -3507,7 +3538,7 @@ function! s:ExprParser.parse_expr9()
3507
3538
return node
3508
3539
endif
3509
3540
while 1
3510
- let key = self .parse_expr1 ()
3541
+ let key = is_rawdict ? self . parse_dict_literal_key () : self .parse_expr1 ()
3511
3542
let token = self .tokenizer.get ()
3512
3543
if token.type == s: TOKEN_CCLOSE
3513
3544
if ! empty (node.value)
@@ -3572,6 +3603,13 @@ function! s:ExprParser.parse_expr9()
3572
3603
return node
3573
3604
endfunction
3574
3605
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
+
3575
3613
" SUBSCRIPT or CONCAT
3576
3614
" dict "." [0-9A-Za-z_]+ => (subscript dict key)
3577
3615
" str "." expr6 => (concat str expr6)
0 commit comments