@@ -306,6 +306,7 @@ def viml_stridx(a, b):
306306NODE_LAMBDA = 92
307307NODE_BLOB = 93
308308NODE_CONST = 94
309+ NODE_METHOD = 95
309310TOKEN_EOF = 1
310311TOKEN_EOL = 2
311312TOKEN_SPACE = 3
@@ -560,6 +561,7 @@ def ExArg():
560561# PLUS .left
561562# SUBSCRIPT .left .right
562563# SLICE .left .rlist
564+ # METHOD .left .right .lambda_rlist
563565# CALL .left .rlist
564566# DOT .left .right
565567# NUMBER .value
@@ -2656,6 +2658,9 @@ def parse_expr7(self):
26562658 # expr8: expr8[expr1]
26572659 # expr8[expr1 : expr1]
26582660 # expr8.name
2661+ # expr8->name(expr1, ...)
2662+ # expr8->s:user_func(expr1, ...)
2663+ # expr8->{lambda}(expr1, ...)
26592664 # expr8(expr1, ...)
26602665 def parse_expr8 (self ):
26612666 left = self .parse_expr9 ()
@@ -2703,6 +2708,16 @@ def parse_expr8(self):
27032708 raise VimLParserException (Err (viml_printf ("unexpected token: %s" , token .value ), token .pos ))
27042709 left = node
27052710 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
27062721 elif token .type == TOKEN_POPEN :
27072722 node = Node (NODE_CALL )
27082723 node .pos = token .pos
@@ -3525,6 +3540,8 @@ def compile(self, node):
35253540 return self .compile_slice (node )
35263541 elif node .type == NODE_DOT :
35273542 return self .compile_dot (node )
3543+ elif node .type == NODE_METHOD :
3544+ return self .compile_method (node )
35283545 elif node .type == NODE_CALL :
35293546 return self .compile_call (node )
35303547 elif node .type == NODE_NUMBER :
@@ -3874,6 +3891,9 @@ def compile_slice(self, node):
38743891 def compile_dot (self , node ):
38753892 return viml_printf ("(dot %s %s)" , self .compile (node .left ), self .compile (node .right ))
38763893
3894+ def compile_method (self , node ):
3895+ return viml_printf ("(method %s %s)" , self .compile (node .left ), self .compile (node .right ))
3896+
38773897 def compile_call (self , node ):
38783898 rlist = [self .compile (vval ) for vval in node .rlist ]
38793899 if viml_empty (rlist ):
0 commit comments