@@ -351,7 +351,8 @@ def viml_type(obj):
351351TOKEN_SHARP = 64
352352TOKEN_ARROW = 65
353353TOKEN_BLOB = 66
354- TOKEN_DOTDOT = 67
354+ TOKEN_LITCOPEN = 67
355+ TOKEN_DOTDOT = 68
355356MAX_FUNC_ARGS = 20
356357def isalpha (c ):
357358 return viml_eqregh (c , "^[A-Za-z]$" )
@@ -2032,8 +2033,12 @@ def get2(self):
20322033 r .seek_cur (1 )
20332034 return self .token (TOKEN_COLON , ":" , pos )
20342035 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 )
20372042 elif c == "(" :
20382043 r .seek_cur (1 )
20392044 return self .token (TOKEN_POPEN , "(" , pos )
@@ -2140,6 +2145,24 @@ def get_dstring(self):
21402145 s += c
21412146 return s
21422147
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+
21432166class ExprParser :
21442167 def __init__ (self , reader ):
21452168 self .reader = reader
@@ -2594,6 +2617,7 @@ def parse_expr8(self):
25942617# 'string'
25952618# [expr1, ...]
25962619# {expr1: expr1, ...}
2620+ # #{literal_key1: expr1, ...}
25972621# {args -> expr1}
25982622# &option
25992623# (expr1)
@@ -2646,7 +2670,8 @@ def parse_expr9(self):
26462670 break
26472671 else :
26482672 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
26502675 savepos = self .reader .tell ()
26512676 nodepos = token .pos
26522677 token = self .tokenizer .get ()
@@ -2722,7 +2747,7 @@ def parse_expr9(self):
27222747 self .tokenizer .get ()
27232748 return node
27242749 while 1 :
2725- key = self .parse_expr1 ()
2750+ key = self .parse_dict_literal_key () if is_litdict else self . parse_expr1 ()
27262751 token = self .tokenizer .get ()
27272752 if token .type == TOKEN_CCLOSE :
27282753 if not viml_empty (node .value ):
@@ -2778,6 +2803,12 @@ def parse_expr9(self):
27782803 raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
27792804 return node
27802805
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+
27812812# SUBSCRIPT or CONCAT
27822813# dict "." [0-9A-Za-z_]+ => (subscript dict key)
27832814# str "." expr6 => (concat str expr6)
0 commit comments