@@ -351,7 +351,8 @@ def viml_type(obj):
351
351
TOKEN_SHARP = 64
352
352
TOKEN_ARROW = 65
353
353
TOKEN_BLOB = 66
354
- TOKEN_DOTDOT = 67
354
+ TOKEN_LITCOPEN = 67
355
+ TOKEN_DOTDOT = 68
355
356
MAX_FUNC_ARGS = 20
356
357
def isalpha (c ):
357
358
return viml_eqregh (c , "^[A-Za-z]$" )
@@ -2032,8 +2033,12 @@ def get2(self):
2032
2033
r .seek_cur (1 )
2033
2034
return self .token (TOKEN_COLON , ":" , pos )
2034
2035
elif c == "#" :
2035
- r .seek_cur (1 )
2036
- return self .token (TOKEN_SHARP , "#" , pos )
2036
+ if r .p (1 ) == "{" :
2037
+ r .seek_cur (2 )
2038
+ return self .token (TOKEN_LITCOPEN , "#{" , pos )
2039
+ else :
2040
+ r .seek_cur (1 )
2041
+ return self .token (TOKEN_SHARP , "#" , pos )
2037
2042
elif c == "(" :
2038
2043
r .seek_cur (1 )
2039
2044
return self .token (TOKEN_POPEN , "(" , pos )
@@ -2140,6 +2145,24 @@ def get_dstring(self):
2140
2145
s += c
2141
2146
return s
2142
2147
2148
+ def get_dict_literal_key (self ):
2149
+ self .reader .skip_white ()
2150
+ r = self .reader
2151
+ c = r .peek ()
2152
+ if not isalnum (c ) and c != "_" and c != "-" :
2153
+ raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
2154
+ s = c
2155
+ self .reader .seek_cur (1 )
2156
+ while TRUE :
2157
+ c = self .reader .p (0 )
2158
+ if c == "<EOF>" or c == "<EOL>" :
2159
+ raise VimLParserException (Err ("unexpectd EOL" , self .reader .getpos ()))
2160
+ if not isalnum (c ) and c != "_" and c != "-" :
2161
+ break
2162
+ self .reader .seek_cur (1 )
2163
+ s += c
2164
+ return s
2165
+
2143
2166
class ExprParser :
2144
2167
def __init__ (self , reader ):
2145
2168
self .reader = reader
@@ -2594,6 +2617,7 @@ def parse_expr8(self):
2594
2617
# 'string'
2595
2618
# [expr1, ...]
2596
2619
# {expr1: expr1, ...}
2620
+ # #{literal_key1: expr1, ...}
2597
2621
# {args -> expr1}
2598
2622
# &option
2599
2623
# (expr1)
@@ -2646,7 +2670,8 @@ def parse_expr9(self):
2646
2670
break
2647
2671
else :
2648
2672
raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
2649
- elif token .type == TOKEN_COPEN :
2673
+ elif token .type == TOKEN_COPEN or token .type == TOKEN_LITCOPEN :
2674
+ is_litdict = token .type == TOKEN_LITCOPEN
2650
2675
savepos = self .reader .tell ()
2651
2676
nodepos = token .pos
2652
2677
token = self .tokenizer .get ()
@@ -2722,7 +2747,7 @@ def parse_expr9(self):
2722
2747
self .tokenizer .get ()
2723
2748
return node
2724
2749
while 1 :
2725
- key = self .parse_expr1 ()
2750
+ key = self .parse_dict_literal_key () if is_litdict else self . parse_expr1 ()
2726
2751
token = self .tokenizer .get ()
2727
2752
if token .type == TOKEN_CCLOSE :
2728
2753
if not viml_empty (node .value ):
@@ -2778,6 +2803,12 @@ def parse_expr9(self):
2778
2803
raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
2779
2804
return node
2780
2805
2806
+ def parse_dict_literal_key (self ):
2807
+ node = Node (NODE_STRING )
2808
+ node .pos = self .reader .tell ()
2809
+ node .value = "'" + self .tokenizer .get_dict_literal_key () + "'"
2810
+ return node
2811
+
2781
2812
# SUBSCRIPT or CONCAT
2782
2813
# dict "." [0-9A-Za-z_]+ => (subscript dict key)
2783
2814
# str "." expr6 => (concat str expr6)
0 commit comments