@@ -309,6 +309,7 @@ def viml_stridx(a, b):
309
309
NODE_CONST = 94
310
310
NODE_EVAL = 95
311
311
NODE_HEREDOC = 96
312
+ NODE_METHOD = 97
312
313
TOKEN_EOF = 1
313
314
TOKEN_EOL = 2
314
315
TOKEN_SPACE = 3
@@ -566,6 +567,7 @@ def ExArg():
566
567
# PLUS .left
567
568
# SUBSCRIPT .left .right
568
569
# SLICE .left .rlist
570
+ # METHOD .left .right .lambda_rlist
569
571
# CALL .left .rlist
570
572
# DOT .left .right
571
573
# NUMBER .value
@@ -2716,6 +2718,9 @@ def parse_expr7(self):
2716
2718
# expr8: expr8[expr1]
2717
2719
# expr8[expr1 : expr1]
2718
2720
# expr8.name
2721
+ # expr8->name(expr1, ...)
2722
+ # expr8->s:user_func(expr1, ...)
2723
+ # expr8->{lambda}(expr1, ...)
2719
2724
# expr8(expr1, ...)
2720
2725
def parse_expr8 (self ):
2721
2726
left = self .parse_expr9 ()
@@ -2763,6 +2768,16 @@ def parse_expr8(self):
2763
2768
raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
2764
2769
left = node
2765
2770
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
2766
2781
elif token .type == TOKEN_POPEN :
2767
2782
node = Node (NODE_CALL )
2768
2783
node .pos = token .pos
@@ -3588,6 +3603,8 @@ def compile(self, node):
3588
3603
return self .compile_slice (node )
3589
3604
elif node .type == NODE_DOT :
3590
3605
return self .compile_dot (node )
3606
+ elif node .type == NODE_METHOD :
3607
+ return self .compile_method (node )
3591
3608
elif node .type == NODE_CALL :
3592
3609
return self .compile_call (node )
3593
3610
elif node .type == NODE_NUMBER :
@@ -3950,6 +3967,9 @@ def compile_slice(self, node):
3950
3967
def compile_dot (self , node ):
3951
3968
return viml_printf ("(dot %s %s)" , self .compile (node .left ), self .compile (node .right ))
3952
3969
3970
+ def compile_method (self , node ):
3971
+ return viml_printf ("(method %s %s)" , self .compile (node .left ), self .compile (node .right ))
3972
+
3953
3973
def compile_call (self , node ):
3954
3974
rlist = [self .compile (vval ) for vval in node .rlist ]
3955
3975
if viml_empty (rlist ):
0 commit comments