@@ -351,6 +351,7 @@ def viml_type(obj):
351351TOKEN_SHARP = 64
352352TOKEN_ARROW = 65
353353TOKEN_BLOB = 66
354+ TOKEN_LITCOPEN = 67
354355MAX_FUNC_ARGS = 20
355356def isalpha (c ):
356357 return viml_eqregh (c , "^[A-Za-z]$" )
@@ -2023,8 +2024,12 @@ def get2(self):
20232024 r .seek_cur (1 )
20242025 return self .token (TOKEN_COLON , ":" , pos )
20252026 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 )
20282033 elif c == "(" :
20292034 r .seek_cur (1 )
20302035 return self .token (TOKEN_POPEN , "(" , pos )
@@ -2131,6 +2136,24 @@ def get_dstring(self):
21312136 s += c
21322137 return s
21332138
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+
21342157class ExprParser :
21352158 def __init__ (self , reader ):
21362159 self .reader = reader
@@ -2575,6 +2598,7 @@ def parse_expr8(self):
25752598# 'string'
25762599# [expr1, ...]
25772600# {expr1: expr1, ...}
2601+ # #{literal_key1: expr1, ...}
25782602# {args -> expr1}
25792603# &option
25802604# (expr1)
@@ -2627,7 +2651,8 @@ def parse_expr9(self):
26272651 break
26282652 else :
26292653 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
26312656 savepos = self .reader .tell ()
26322657 nodepos = token .pos
26332658 token = self .tokenizer .get ()
@@ -2703,7 +2728,7 @@ def parse_expr9(self):
27032728 self .tokenizer .get ()
27042729 return node
27052730 while 1 :
2706- key = self .parse_expr1 ()
2731+ key = self .parse_dict_literal_key () if is_litdict else self . parse_expr1 ()
27072732 token = self .tokenizer .get ()
27082733 if token .type == TOKEN_CCLOSE :
27092734 if not viml_empty (node .value ):
@@ -2759,6 +2784,12 @@ def parse_expr9(self):
27592784 raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
27602785 return node
27612786
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+
27622793# SUBSCRIPT or CONCAT
27632794# dict "." [0-9A-Za-z_]+ => (subscript dict key)
27642795# str "." expr6 => (concat str expr6)
0 commit comments