@@ -309,6 +309,7 @@ def viml_stridx(a, b):
309309NODE_CONST = 94
310310NODE_EVAL = 95
311311NODE_HEREDOC = 96
312+ NODE_METHOD = 97
312313TOKEN_EOF = 1
313314TOKEN_EOL = 2
314315TOKEN_SPACE = 3
@@ -566,6 +567,7 @@ def ExArg():
566567# PLUS .left
567568# SUBSCRIPT .left .right
568569# SLICE .left .rlist
570+ # METHOD .left .right .lambda_rlist
569571# CALL .left .rlist
570572# DOT .left .right
571573# NUMBER .value
@@ -2716,6 +2718,9 @@ def parse_expr7(self):
27162718 # expr8: expr8[expr1]
27172719 # expr8[expr1 : expr1]
27182720 # expr8.name
2721+ # expr8->name(expr1, ...)
2722+ # expr8->s:user_func(expr1, ...)
2723+ # expr8->{lambda}(expr1, ...)
27192724 # expr8(expr1, ...)
27202725 def parse_expr8 (self ):
27212726 left = self .parse_expr9 ()
@@ -2763,6 +2768,16 @@ def parse_expr8(self):
27632768 raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
27642769 left = node
27652770 del node
2771+ elif token .type == TOKEN_ARROW :
2772+ node = Node (NODE_METHOD )
2773+ node .pos = token .pos
2774+ node .left = left
2775+ node .right = self .parse_expr8 ()
2776+ node .lambda_rlist = NIL
2777+ if node .right .type != NODE_CALL :
2778+ raise VimLParserException (Err ("Rhs of method operator must be an function call" , node .right .pos ))
2779+ left = node
2780+ del node
27662781 elif token .type == TOKEN_POPEN :
27672782 node = Node (NODE_CALL )
27682783 node .pos = token .pos
@@ -3588,6 +3603,8 @@ def compile(self, node):
35883603 return self .compile_slice (node )
35893604 elif node .type == NODE_DOT :
35903605 return self .compile_dot (node )
3606+ elif node .type == NODE_METHOD :
3607+ return self .compile_method (node )
35913608 elif node .type == NODE_CALL :
35923609 return self .compile_call (node )
35933610 elif node .type == NODE_NUMBER :
@@ -3950,6 +3967,9 @@ def compile_slice(self, node):
39503967 def compile_dot (self , node ):
39513968 return viml_printf ("(dot %s %s)" , self .compile (node .left ), self .compile (node .right ))
39523969
3970+ def compile_method (self , node ):
3971+ return viml_printf ("(method %s %s)" , self .compile (node .left ), self .compile (node .right ))
3972+
39533973 def compile_call (self , node ):
39543974 rlist = [self .compile (vval ) for vval in node .rlist ]
39553975 if viml_empty (rlist ):
0 commit comments