@@ -1410,20 +1410,18 @@ def parse_heredoc(self):
1410
1410
node .op = ""
1411
1411
node .rlist = []
1412
1412
node .body = []
1413
- words = []
1414
1413
while TRUE :
1415
1414
self .reader .skip_white ()
1416
1415
key = self .reader .read_alpha ()
1417
1416
if key == "" :
1418
1417
break
1419
- if not viml_eqregh (key , "^[a-z]" ):
1418
+ if not islower (key [ 0 ] ):
1420
1419
node .op = key
1421
1420
break
1422
1421
else :
1423
- viml_add (words , key )
1424
- if node .op == "" :
1425
- return NIL
1426
- node .rlist = words
1422
+ viml_add (node .rlist , key )
1423
+ if node .op == "" or not viml_eqregh (node .op , "^[^a-z]\\ S\\ +$" ):
1424
+ raise VimLParserException (Err ("E172: Missing marker" , self .reader .getpos ()))
1427
1425
self .parse_trail ()
1428
1426
while TRUE :
1429
1427
if self .reader .peek () == "<EOF>" :
@@ -1433,7 +1431,7 @@ def parse_heredoc(self):
1433
1431
return node
1434
1432
viml_add (node .body , line )
1435
1433
self .reader .get ()
1436
- return NIL
1434
+ raise VimLParserException ( Err ( viml_printf ( "E990: Missing end marker '%s'" , node . op ), self . reader . getpos ()))
1437
1435
1438
1436
def parse_cmd_let (self ):
1439
1437
pos = self .reader .tell ()
@@ -3825,9 +3823,16 @@ def compile_lambda(self, node):
3825
3823
return viml_printf ("(lambda (%s) %s)" , viml_join (rlist , " " ), self .compile (node .left ))
3826
3824
3827
3825
def compile_heredoc (self , node ):
3828
- rlist = [self .escape_string (vval ) for vval in node .rlist ]
3829
- body = [self .escape_string (vval ) for vval in node .body ]
3830
- return viml_printf ("(heredoc (list %s) %s (list %s))" , viml_join (rlist , " " ), self .escape_string (node .op ), viml_join (body , " " ))
3826
+ if viml_empty (node .rlist ):
3827
+ rlist = "(list)"
3828
+ else :
3829
+ rlist = "(list " + viml_join ([self .escape_string (vval ) for vval in node .rlist ], " " ) + ")"
3830
+ if viml_empty (node .body ):
3831
+ body = "(list)"
3832
+ else :
3833
+ body = "(list " + viml_join ([self .escape_string (vval ) for vval in node .body ], " " ) + ")"
3834
+ op = self .escape_string (node .op )
3835
+ return viml_printf ("(heredoc %s %s %s)" , rlist , op , body )
3831
3836
3832
3837
# TODO: under construction
3833
3838
class RegexpParser :
0 commit comments