@@ -1468,9 +1468,16 @@ def parse_cmd_let(self):
14681468 # :let
14691469 if self .ends_excmds (self .reader .peek ()):
14701470 self .reader .seek_set (pos )
1471- self .parse_cmd_common ()
1471+ node = Node (NODE_LET )
1472+ node .pos = self .ea .cmdpos
1473+ node .ea = self .ea
1474+ node .left = NIL
1475+ node .list = NIL
1476+ node .rest = NIL
1477+ node .right = NIL
1478+ self .add_node (node )
14721479 return
1473- lhs = self .parse_letlhs ()
1480+ lhs = self .parse_letlhs (FALSE )
14741481 self .reader .skip_white ()
14751482 s1 = self .reader .peekn (1 )
14761483 s2 = self .reader .peekn (2 )
@@ -1479,8 +1486,14 @@ def parse_cmd_let(self):
14791486 s2 = self .reader .peekn (3 )
14801487 # :let {var-name} ..
14811488 if self .ends_excmds (s1 ) or s2 != "+=" and s2 != "-=" and s2 != ".=" and s2 != "..=" and s2 != "*=" and s2 != "/=" and s2 != "%=" and s1 != "=" :
1482- self .reader .seek_set (pos )
1483- self .parse_cmd_common ()
1489+ node = Node (NODE_LET )
1490+ node .pos = self .ea .cmdpos
1491+ node .ea = self .ea
1492+ node .left = lhs .left
1493+ node .list = lhs .list
1494+ node .rest = lhs .rest
1495+ node .right = NIL
1496+ self .add_node (node )
14841497 return
14851498 # :let left op right
14861499 node = Node (NODE_LET )
@@ -1507,16 +1520,28 @@ def parse_cmd_const(self):
15071520 self .reader .skip_white ()
15081521 # :const
15091522 if self .ends_excmds (self .reader .peek ()):
1510- self .reader .seek_set (pos )
1511- self .parse_cmd_common ()
1523+ node = Node (NODE_CONST )
1524+ node .pos = self .ea .cmdpos
1525+ node .ea = self .ea
1526+ node .left = NIL
1527+ node .list = NIL
1528+ node .rest = NIL
1529+ node .right = NIL
1530+ self .add_node (node )
15121531 return
1513- lhs = self .parse_constlhs ( )
1532+ lhs = self .parse_letlhs ( TRUE )
15141533 self .reader .skip_white ()
15151534 s1 = self .reader .peekn (1 )
15161535 # :const {var-name}
15171536 if self .ends_excmds (s1 ) or s1 != "=" :
1518- self .reader .seek_set (pos )
1519- self .parse_cmd_common ()
1537+ node = Node (NODE_CONST )
1538+ node .pos = self .ea .cmdpos
1539+ node .ea = self .ea
1540+ node .left = lhs .left
1541+ node .list = lhs .list
1542+ node .rest = lhs .rest
1543+ node .right = NIL
1544+ self .add_node (node )
15201545 return
15211546 # :const left op right
15221547 node = Node (NODE_CONST )
@@ -1636,7 +1661,7 @@ def parse_cmd_for(self):
16361661 node .left = NIL
16371662 node .right = NIL
16381663 node .endfor = NIL
1639- lhs = self .parse_letlhs ()
1664+ lhs = self .parse_letlhs (FALSE )
16401665 node .left = lhs .left
16411666 node .list = lhs .list
16421667 node .rest = lhs .rest
@@ -1808,7 +1833,6 @@ def parse_lvalue(self):
18081833 return node
18091834 raise VimLParserException (Err ("Invalid Expression" , node .pos ))
18101835
1811- # TODO: merge with s:VimLParser.parse_lvalue()
18121836 def parse_constlvalue (self ):
18131837 p = LvalueParser (self .reader )
18141838 node = p .parse ()
@@ -1840,7 +1864,7 @@ def parse_lvaluelist(self):
18401864 return list
18411865
18421866 # FIXME:
1843- def parse_letlhs (self ):
1867+ def parse_letlhs (self , is_const ):
18441868 lhs = AttributeDict ({"left" : NIL , "list" : NIL , "rest" : NIL })
18451869 tokenizer = ExprTokenizer (self .reader )
18461870 if tokenizer .peek ().type == TOKEN_SQOPEN :
@@ -1864,39 +1888,12 @@ def parse_letlhs(self):
18641888 raise VimLParserException (Err (viml_printf ("E475 Invalid argument: %s" , token .value ), token .pos ))
18651889 else :
18661890 raise VimLParserException (Err (viml_printf ("E475 Invalid argument: %s" , token .value ), token .pos ))
1891+ elif is_const :
1892+ lhs .left = self .parse_constlvalue ()
18671893 else :
18681894 lhs .left = self .parse_lvalue ()
18691895 return lhs
18701896
1871- # TODO: merge with s:VimLParser.parse_letlhs() ?
1872- def parse_constlhs (self ):
1873- lhs = AttributeDict ({"left" : NIL , "list" : NIL , "rest" : NIL })
1874- tokenizer = ExprTokenizer (self .reader )
1875- if tokenizer .peek ().type == TOKEN_SQOPEN :
1876- tokenizer .get ()
1877- lhs .list = []
1878- while TRUE :
1879- node = self .parse_lvalue ()
1880- viml_add (lhs .list , node )
1881- token = tokenizer .get ()
1882- if token .type == TOKEN_SQCLOSE :
1883- break
1884- elif token .type == TOKEN_COMMA :
1885- continue
1886- elif token .type == TOKEN_SEMICOLON :
1887- node = self .parse_lvalue ()
1888- lhs .rest = node
1889- token = tokenizer .get ()
1890- if token .type == TOKEN_SQCLOSE :
1891- break
1892- else :
1893- raise VimLParserException (Err (viml_printf ("E475 Invalid argument: %s" , token .value ), token .pos ))
1894- else :
1895- raise VimLParserException (Err (viml_printf ("E475 Invalid argument: %s" , token .value ), token .pos ))
1896- else :
1897- lhs .left = self .parse_constlvalue ()
1898- return lhs
1899-
19001897 def ends_excmds (self , c ):
19011898 return c == "" or c == "|" or c == "\" " or c == "<EOF>" or c == "<EOL>"
19021899
@@ -3600,29 +3597,30 @@ def compile_excall(self, node):
36003597 self .out ("(call %s)" , self .compile (node .left ))
36013598
36023599 def compile_let (self , node ):
3603- left = ""
3604- if node .left is not NIL :
3605- left = self .compile (node .left )
3606- else :
3607- left = viml_join ([self .compile (vval ) for vval in node .list ], " " )
3608- if node .rest is not NIL :
3609- left += " . " + self .compile (node .rest )
3610- left = "(" + left + ")"
3611- right = self .compile (node .right )
3612- self .out ("(let %s %s %s)" , node .op , left , right )
3600+ self .compile_letconst (node , "let" )
36133601
3614- # TODO: merge with s:Compiler.compile_let() ?
36153602 def compile_const (self , node ):
3603+ self .compile_letconst (node , "const" )
3604+
3605+ def compile_letconst (self , node , cmd ):
36163606 left = ""
3607+ right = ""
3608+ if node .left is NIL and node .right is NIL :
3609+ self .out ("(%s)" , cmd )
3610+ return
36173611 if node .left is not NIL :
36183612 left = self .compile (node .left )
36193613 else :
36203614 left = viml_join ([self .compile (vval ) for vval in node .list ], " " )
36213615 if node .rest is not NIL :
36223616 left += " . " + self .compile (node .rest )
36233617 left = "(" + left + ")"
3624- right = self .compile (node .right )
3625- self .out ("(const %s %s %s)" , node .op , left , right )
3618+ if node .right is not NIL :
3619+ right = self .compile (node .right )
3620+ if node .left is not NIL and node .right is NIL :
3621+ self .out ("(%s () %s)" , cmd , left )
3622+ else :
3623+ self .out ("(%s %s %s %s)" , cmd , node .op , left , right )
36263624
36273625 def compile_unlet (self , node ):
36283626 list = [self .compile (vval ) for vval in node .list ]
0 commit comments