@@ -1410,20 +1410,18 @@ def parse_heredoc(self):
14101410 node .op = ""
14111411 node .rlist = []
14121412 node .body = []
1413- words = []
14141413 while TRUE :
14151414 self .reader .skip_white ()
14161415 key = self .reader .read_alpha ()
14171416 if key == "" :
14181417 break
1419- if not viml_eqregh (key , "^[a-z]" ):
1418+ if not islower (key [ 0 ] ):
14201419 node .op = key
14211420 break
14221421 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 ()))
14271425 self .parse_trail ()
14281426 while TRUE :
14291427 if self .reader .peek () == "<EOF>" :
@@ -1433,7 +1431,7 @@ def parse_heredoc(self):
14331431 return node
14341432 viml_add (node .body , line )
14351433 self .reader .get ()
1436- return NIL
1434+ raise VimLParserException ( Err ( viml_printf ( "E990: Missing end marker '%s'" , node . op ), self . reader . getpos ()))
14371435
14381436 def parse_cmd_let (self ):
14391437 pos = self .reader .tell ()
@@ -3825,9 +3823,16 @@ def compile_lambda(self, node):
38253823 return viml_printf ("(lambda (%s) %s)" , viml_join (rlist , " " ), self .compile (node .left ))
38263824
38273825 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 )
38313836
38323837# TODO: under construction
38333838class RegexpParser :
0 commit comments