Skip to content

Commit 4a60bcb

Browse files
committed
gen
1 parent a74f173 commit 4a60bcb

File tree

2 files changed

+110
-121
lines changed

2 files changed

+110
-121
lines changed

js/vimlparser.js

+58-67
Original file line numberDiff line numberDiff line change
@@ -1787,10 +1787,17 @@ VimLParser.prototype.parse_cmd_let = function() {
17871787
// :let
17881788
if (this.ends_excmds(this.reader.peek())) {
17891789
this.reader.seek_set(pos);
1790-
this.parse_cmd_common();
1790+
var node = Node(NODE_LET);
1791+
node.pos = this.ea.cmdpos;
1792+
node.ea = this.ea;
1793+
node.left = NIL;
1794+
node.list = NIL;
1795+
node.rest = NIL;
1796+
node.right = NIL;
1797+
this.add_node(node);
17911798
return;
17921799
}
1793-
var lhs = this.parse_letlhs();
1800+
var lhs = this.parse_letlhs(FALSE);
17941801
this.reader.skip_white();
17951802
var s1 = this.reader.peekn(1);
17961803
var s2 = this.reader.peekn(2);
@@ -1800,8 +1807,14 @@ VimLParser.prototype.parse_cmd_let = function() {
18001807
}
18011808
// :let {var-name} ..
18021809
if (this.ends_excmds(s1) || s2 != "+=" && s2 != "-=" && s2 != ".=" && s2 != "..=" && s2 != "*=" && s2 != "/=" && s2 != "%=" && s1 != "=") {
1803-
this.reader.seek_set(pos);
1804-
this.parse_cmd_common();
1810+
var node = Node(NODE_LET);
1811+
node.pos = this.ea.cmdpos;
1812+
node.ea = this.ea;
1813+
node.left = lhs.left;
1814+
node.list = lhs.list;
1815+
node.rest = lhs.rest;
1816+
node.right = NIL;
1817+
this.add_node(node);
18051818
return;
18061819
}
18071820
// :let left op right
@@ -1833,17 +1846,29 @@ VimLParser.prototype.parse_cmd_const = function() {
18331846
this.reader.skip_white();
18341847
// :const
18351848
if (this.ends_excmds(this.reader.peek())) {
1836-
this.reader.seek_set(pos);
1837-
this.parse_cmd_common();
1849+
var node = Node(NODE_CONST);
1850+
node.pos = this.ea.cmdpos;
1851+
node.ea = this.ea;
1852+
node.left = NIL;
1853+
node.list = NIL;
1854+
node.rest = NIL;
1855+
node.right = NIL;
1856+
this.add_node(node);
18381857
return;
18391858
}
1840-
var lhs = this.parse_constlhs();
1859+
var lhs = this.parse_letlhs(TRUE);
18411860
this.reader.skip_white();
18421861
var s1 = this.reader.peekn(1);
18431862
// :const {var-name}
18441863
if (this.ends_excmds(s1) || s1 != "=") {
1845-
this.reader.seek_set(pos);
1846-
this.parse_cmd_common();
1864+
var node = Node(NODE_CONST);
1865+
node.pos = this.ea.cmdpos;
1866+
node.ea = this.ea;
1867+
node.left = lhs.left;
1868+
node.list = lhs.list;
1869+
node.rest = lhs.rest;
1870+
node.right = NIL;
1871+
this.add_node(node);
18471872
return;
18481873
}
18491874
// :const left op right
@@ -1983,7 +2008,7 @@ VimLParser.prototype.parse_cmd_for = function() {
19832008
node.left = NIL;
19842009
node.right = NIL;
19852010
node.endfor = NIL;
1986-
var lhs = this.parse_letlhs();
2011+
var lhs = this.parse_letlhs(FALSE);
19872012
node.left = lhs.left;
19882013
node.list = lhs.list;
19892014
node.rest = lhs.rest;
@@ -2195,7 +2220,6 @@ VimLParser.prototype.parse_lvalue = function() {
21952220
throw Err("Invalid Expression", node.pos);
21962221
}
21972222

2198-
// TODO: merge with s:VimLParser.parse_lvalue()
21992223
VimLParser.prototype.parse_constlvalue = function() {
22002224
var p = new LvalueParser(this.reader);
22012225
var node = p.parse();
@@ -2238,7 +2262,7 @@ VimLParser.prototype.parse_lvaluelist = function() {
22382262
}
22392263

22402264
// FIXME:
2241-
VimLParser.prototype.parse_letlhs = function() {
2265+
VimLParser.prototype.parse_letlhs = function(is_const) {
22422266
var lhs = {"left":NIL, "list":NIL, "rest":NIL};
22432267
var tokenizer = new ExprTokenizer(this.reader);
22442268
if (tokenizer.peek().type == TOKEN_SQOPEN) {
@@ -2270,47 +2294,11 @@ VimLParser.prototype.parse_letlhs = function() {
22702294
}
22712295
}
22722296
}
2273-
else {
2274-
lhs.left = this.parse_lvalue();
2275-
}
2276-
return lhs;
2277-
}
2278-
2279-
// TODO: merge with s:VimLParser.parse_letlhs() ?
2280-
VimLParser.prototype.parse_constlhs = function() {
2281-
var lhs = {"left":NIL, "list":NIL, "rest":NIL};
2282-
var tokenizer = new ExprTokenizer(this.reader);
2283-
if (tokenizer.peek().type == TOKEN_SQOPEN) {
2284-
tokenizer.get();
2285-
lhs.list = [];
2286-
while (TRUE) {
2287-
var node = this.parse_lvalue();
2288-
viml_add(lhs.list, node);
2289-
var token = tokenizer.get();
2290-
if (token.type == TOKEN_SQCLOSE) {
2291-
break;
2292-
}
2293-
else if (token.type == TOKEN_COMMA) {
2294-
continue;
2295-
}
2296-
else if (token.type == TOKEN_SEMICOLON) {
2297-
var node = this.parse_lvalue();
2298-
lhs.rest = node;
2299-
var token = tokenizer.get();
2300-
if (token.type == TOKEN_SQCLOSE) {
2301-
break;
2302-
}
2303-
else {
2304-
throw Err(viml_printf("E475 Invalid argument: %s", token.value), token.pos);
2305-
}
2306-
}
2307-
else {
2308-
throw Err(viml_printf("E475 Invalid argument: %s", token.value), token.pos);
2309-
}
2310-
}
2297+
else if (is_const) {
2298+
lhs.left = this.parse_constlvalue();
23112299
}
23122300
else {
2313-
lhs.left = this.parse_constlvalue();
2301+
lhs.left = this.parse_lvalue();
23142302
}
23152303
return lhs;
23162304
}
@@ -4501,24 +4489,20 @@ Compiler.prototype.compile_excall = function(node) {
45014489
}
45024490

45034491
Compiler.prototype.compile_let = function(node) {
4504-
var left = "";
4505-
if (node.left !== NIL) {
4506-
var left = this.compile(node.left);
4507-
}
4508-
else {
4509-
var left = viml_join(node.list.map((function(vval) { return this.compile(vval); }).bind(this)), " ");
4510-
if (node.rest !== NIL) {
4511-
left += " . " + this.compile(node.rest);
4512-
}
4513-
var left = "(" + left + ")";
4514-
}
4515-
var right = this.compile(node.right);
4516-
this.out("(let %s %s %s)", node.op, left, right);
4492+
this.compile_letconst(node, "let");
45174493
}
45184494

4519-
// TODO: merge with s:Compiler.compile_let() ?
45204495
Compiler.prototype.compile_const = function(node) {
4496+
this.compile_letconst(node, "const");
4497+
}
4498+
4499+
Compiler.prototype.compile_letconst = function(node, cmd) {
45214500
var left = "";
4501+
var right = "";
4502+
if (node.left === NIL && node.right === NIL) {
4503+
this.out("(%s)", cmd);
4504+
return;
4505+
}
45224506
if (node.left !== NIL) {
45234507
var left = this.compile(node.left);
45244508
}
@@ -4529,8 +4513,15 @@ Compiler.prototype.compile_const = function(node) {
45294513
}
45304514
var left = "(" + left + ")";
45314515
}
4532-
var right = this.compile(node.right);
4533-
this.out("(const %s %s %s)", node.op, left, right);
4516+
if (node.right !== NIL) {
4517+
var right = this.compile(node.right);
4518+
}
4519+
if (node.left !== NIL && node.right === NIL) {
4520+
this.out("(%s () %s)", cmd, left);
4521+
}
4522+
else {
4523+
this.out("(%s %s %s %s)", cmd, node.op, left, right);
4524+
}
45344525
}
45354526

45364527
Compiler.prototype.compile_unlet = function(node) {

py/vimlparser.py

+52-54
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)