@@ -306,6 +306,7 @@ def viml_stridx(a, b):
306
306
NODE_LAMBDA = 92
307
307
NODE_BLOB = 93
308
308
NODE_CONST = 94
309
+ NODE_METHOD = 95
309
310
TOKEN_EOF = 1
310
311
TOKEN_EOL = 2
311
312
TOKEN_SPACE = 3
@@ -560,6 +561,7 @@ def ExArg():
560
561
# PLUS .left
561
562
# SUBSCRIPT .left .right
562
563
# SLICE .left .rlist
564
+ # METHOD .left .right .lambda_rlist
563
565
# CALL .left .rlist
564
566
# DOT .left .right
565
567
# NUMBER .value
@@ -2656,6 +2658,9 @@ def parse_expr7(self):
2656
2658
# expr8: expr8[expr1]
2657
2659
# expr8[expr1 : expr1]
2658
2660
# expr8.name
2661
+ # expr8->name(expr1, ...)
2662
+ # expr8->s:user_func(expr1, ...)
2663
+ # expr8->{lambda}(expr1, ...)
2659
2664
# expr8(expr1, ...)
2660
2665
def parse_expr8 (self ):
2661
2666
left = self .parse_expr9 ()
@@ -2703,6 +2708,16 @@ def parse_expr8(self):
2703
2708
raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
2704
2709
left = node
2705
2710
del node
2711
+ elif token .type == TOKEN_ARROW :
2712
+ node = Node (NODE_METHOD )
2713
+ node .pos = token .pos
2714
+ node .left = left
2715
+ node .right = self .parse_expr8 ()
2716
+ node .lambda_rlist = NIL
2717
+ if node .right .type != NODE_CALL :
2718
+ raise VimLParserException (Err ("Invalid method syntax" , node .right .pos ))
2719
+ left = node
2720
+ del node
2706
2721
elif token .type == TOKEN_POPEN :
2707
2722
node = Node (NODE_CALL )
2708
2723
node .pos = token .pos
@@ -3525,6 +3540,8 @@ def compile(self, node):
3525
3540
return self .compile_slice (node )
3526
3541
elif node .type == NODE_DOT :
3527
3542
return self .compile_dot (node )
3543
+ elif node .type == NODE_METHOD :
3544
+ return self .compile_method (node )
3528
3545
elif node .type == NODE_CALL :
3529
3546
return self .compile_call (node )
3530
3547
elif node .type == NODE_NUMBER :
@@ -3874,6 +3891,9 @@ def compile_slice(self, node):
3874
3891
def compile_dot (self , node ):
3875
3892
return viml_printf ("(dot %s %s)" , self .compile (node .left ), self .compile (node .right ))
3876
3893
3894
+ def compile_method (self , node ):
3895
+ return viml_printf ("(method %s %s)" , self .compile (node .left ), self .compile (node .right ))
3896
+
3877
3897
def compile_call (self , node ):
3878
3898
rlist = [self .compile (vval ) for vval in node .rlist ]
3879
3899
if viml_empty (rlist ):
0 commit comments