@@ -351,6 +351,7 @@ def viml_type(obj):
351
351
TOKEN_SHARP = 64
352
352
TOKEN_ARROW = 65
353
353
TOKEN_BLOB = 66
354
+ TOKEN_LITCOPEN = 67
354
355
MAX_FUNC_ARGS = 20
355
356
def isalpha (c ):
356
357
return viml_eqregh (c , "^[A-Za-z]$" )
@@ -2023,8 +2024,12 @@ def get2(self):
2023
2024
r .seek_cur (1 )
2024
2025
return self .token (TOKEN_COLON , ":" , pos )
2025
2026
elif c == "#" :
2026
- r .seek_cur (1 )
2027
- return self .token (TOKEN_SHARP , "#" , pos )
2027
+ if r .p (1 ) == "{" :
2028
+ r .seek_cur (2 )
2029
+ return self .token (TOKEN_LITCOPEN , "#{" , pos )
2030
+ else :
2031
+ r .seek_cur (1 )
2032
+ return self .token (TOKEN_SHARP , "#" , pos )
2028
2033
elif c == "(" :
2029
2034
r .seek_cur (1 )
2030
2035
return self .token (TOKEN_POPEN , "(" , pos )
@@ -2131,6 +2136,24 @@ def get_dstring(self):
2131
2136
s += c
2132
2137
return s
2133
2138
2139
+ def get_dict_literal_key (self ):
2140
+ self .reader .skip_white ()
2141
+ r = self .reader
2142
+ c = r .peek ()
2143
+ if not isalnum (c ) and c != "_" and c != "-" :
2144
+ raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
2145
+ s = c
2146
+ self .reader .seek_cur (1 )
2147
+ while TRUE :
2148
+ c = self .reader .p (0 )
2149
+ if c == "<EOF>" or c == "<EOL>" :
2150
+ raise VimLParserException (Err ("unexpectd EOL" , self .reader .getpos ()))
2151
+ if not isalnum (c ) and c != "_" and c != "-" :
2152
+ break
2153
+ self .reader .seek_cur (1 )
2154
+ s += c
2155
+ return s
2156
+
2134
2157
class ExprParser :
2135
2158
def __init__ (self , reader ):
2136
2159
self .reader = reader
@@ -2575,6 +2598,7 @@ def parse_expr8(self):
2575
2598
# 'string'
2576
2599
# [expr1, ...]
2577
2600
# {expr1: expr1, ...}
2601
+ # #{literal_key1: expr1, ...}
2578
2602
# {args -> expr1}
2579
2603
# &option
2580
2604
# (expr1)
@@ -2627,7 +2651,8 @@ def parse_expr9(self):
2627
2651
break
2628
2652
else :
2629
2653
raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
2630
- elif token .type == TOKEN_COPEN :
2654
+ elif token .type == TOKEN_COPEN or token .type == TOKEN_LITCOPEN :
2655
+ is_litdict = token .type == TOKEN_LITCOPEN
2631
2656
savepos = self .reader .tell ()
2632
2657
nodepos = token .pos
2633
2658
token = self .tokenizer .get ()
@@ -2703,7 +2728,7 @@ def parse_expr9(self):
2703
2728
self .tokenizer .get ()
2704
2729
return node
2705
2730
while 1 :
2706
- key = self .parse_expr1 ()
2731
+ key = self .parse_dict_literal_key () if is_litdict else self . parse_expr1 ()
2707
2732
token = self .tokenizer .get ()
2708
2733
if token .type == TOKEN_CCLOSE :
2709
2734
if not viml_empty (node .value ):
@@ -2759,6 +2784,12 @@ def parse_expr9(self):
2759
2784
raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
2760
2785
return node
2761
2786
2787
+ def parse_dict_literal_key (self ):
2788
+ node = Node (NODE_STRING )
2789
+ node .pos = self .reader .tell ()
2790
+ node .value = "'" + self .tokenizer .get_dict_literal_key () + "'"
2791
+ return node
2792
+
2762
2793
# SUBSCRIPT or CONCAT
2763
2794
# dict "." [0-9A-Za-z_]+ => (subscript dict key)
2764
2795
# str "." expr6 => (concat str expr6)
0 commit comments