Skip to content

Commit 27d0c05

Browse files
author
Kuniwak
committed
Update js/py
But, I do not understand how "opprec" works, so this changes may be imcompleted...
1 parent 856680c commit 27d0c05

File tree

2 files changed

+113
-55
lines changed

2 files changed

+113
-55
lines changed

js/vimlparser.js

Lines changed: 63 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,8 @@ var NODE_IDENTIFIER = 86;
302302
var NODE_CURLYNAME = 87;
303303
var NODE_ENV = 88;
304304
var NODE_REG = 89;
305+
var NODE_CURLYNAMEPART = 90;
306+
var NODE_CURLYNAMEEXPR = 91;
305307
var TOKEN_EOF = 1;
306308
var TOKEN_EOL = 2;
307309
var TOKEN_SPACE = 3;
@@ -561,6 +563,8 @@ function ExArg() {
561563
// CURLYNAME .value
562564
// ENV .value
563565
// REG .value
566+
// CURLYNAMEPART .value
567+
// CURLYNAMEEXPR .value
564568
function Node(type) {
565569
return {"type":type};
566570
}
@@ -3101,46 +3105,68 @@ ExprParser.prototype.parse_dot = function(token, left) {
31013105
}
31023106

31033107
ExprParser.prototype.parse_identifier = function() {
3104-
var id = [];
31053108
this.reader.skip_white();
31063109
var npos = this.reader.getpos();
3110+
var curly_parts = this.parse_curly_parts();
3111+
if (viml_len(curly_parts) == 1 && curly_parts[0].type == NODE_CURLYNAMEPART) {
3112+
var node = Node(NODE_IDENTIFIER);
3113+
node.pos = npos;
3114+
node.value = curly_parts[0].value;
3115+
}
3116+
else {
3117+
var node = Node(NODE_CURLYNAME);
3118+
node.pos = npos;
3119+
node.value = curly_parts;
3120+
}
3121+
return node;
3122+
}
3123+
3124+
ExprParser.prototype.parse_curly_parts = function() {
3125+
var curly_parts = [];
31073126
var c = this.reader.peek();
3127+
var pos = this.reader.getpos();
31083128
if (c == "<" && viml_equalci(this.reader.peekn(5), "<SID>")) {
31093129
var name = this.reader.getn(5);
3110-
viml_add(id, {"curly":0, "value":name});
3130+
var node = Node(NODE_CURLYNAMEPART);
3131+
node.curly = 0;
3132+
// Keep backword compatibility for the curly attribute
3133+
node.pos = pos;
3134+
node.value = name;
3135+
viml_add(curly_parts, node);
31113136
}
31123137
while (1) {
31133138
var c = this.reader.peek();
31143139
if (isnamec(c)) {
3140+
var pos = this.reader.getpos();
31153141
var name = this.reader.read_name();
3116-
viml_add(id, {"curly":0, "value":name});
3142+
var node = Node(NODE_CURLYNAMEPART);
3143+
node.curly = 0;
3144+
// Keep backword compatibility for the curly attribute
3145+
node.pos = pos;
3146+
node.value = name;
3147+
viml_add(curly_parts, node);
31173148
}
31183149
else if (c == "{") {
31193150
this.reader.get();
3120-
var node = this.parse_expr1();
3151+
var pos = this.reader.getpos();
3152+
var node = Node(NODE_CURLYNAMEEXPR);
3153+
node.curly = 1;
3154+
// Keep backword compatibility for the curly attribute
3155+
node.pos = pos;
3156+
node.value = this.parse_expr1();
3157+
viml_add(curly_parts, node);
31213158
this.reader.skip_white();
31223159
var c = this.reader.p(0);
31233160
if (c != "}") {
31243161
throw Err(viml_printf("unexpected token: %s", c), this.reader.getpos());
31253162
}
31263163
this.reader.seek_cur(1);
3127-
viml_add(id, {"curly":1, "value":node});
31283164
}
31293165
else {
31303166
break;
31313167
}
31323168
}
3133-
if (viml_len(id) == 1 && id[0].curly == 0) {
3134-
var node = Node(NODE_IDENTIFIER);
3135-
node.pos = npos;
3136-
node.value = id[0].value;
3137-
}
3138-
else {
3139-
var node = Node(NODE_CURLYNAME);
3140-
node.pos = npos;
3141-
node.value = id;
3142-
}
3143-
return node;
3169+
return curly_parts;
31443170
}
31453171

31463172
function LvalueParser() { ExprParser.apply(this, arguments); this.__init__.apply(this, arguments); }
@@ -3772,6 +3798,12 @@ Compiler.prototype.compile = function(node) {
37723798
else if (node.type == NODE_REG) {
37733799
return this.compile_reg(node);
37743800
}
3801+
else if (node.type == NODE_CURLYNAMEPART) {
3802+
return this.compile_curlynamepart(node);
3803+
}
3804+
else if (node.type == NODE_CURLYNAMEEXPR) {
3805+
return this.compile_curlynameexpr(node);
3806+
}
37753807
else {
37763808
throw viml_printf("Compiler: unknown node: %s", viml_string(node));
37773809
}
@@ -4224,18 +4256,7 @@ Compiler.prototype.compile_identifier = function(node) {
42244256
}
42254257

42264258
Compiler.prototype.compile_curlyname = function(node) {
4227-
var name = "";
4228-
var __c11 = node.value;
4229-
for (var __i11 = 0; __i11 < __c11.length; ++__i11) {
4230-
var x = __c11[__i11];
4231-
if (x.curly) {
4232-
name += "{" + this.compile(x.value) + "}";
4233-
}
4234-
else {
4235-
name += x.value;
4236-
}
4237-
}
4238-
return name;
4259+
return viml_join(node.value.map((function(vval) { return this.compile(vval); }).bind(this)), "");
42394260
}
42404261

42414262
Compiler.prototype.compile_env = function(node) {
@@ -4246,6 +4267,14 @@ Compiler.prototype.compile_reg = function(node) {
42464267
return node.value;
42474268
}
42484269

4270+
Compiler.prototype.compile_curlynamepart = function(node) {
4271+
return node.value;
4272+
}
4273+
4274+
Compiler.prototype.compile_curlynameexpr = function(node) {
4275+
return "{" + this.compile(node.value) + "}";
4276+
}
4277+
42494278
// TODO: under construction
42504279
function RegexpParser() { this.__init__.apply(this, arguments); }
42514280
RegexpParser.prototype.RE_VERY_NOMAGIC = 1;
@@ -4926,9 +4955,9 @@ RegexpParser.prototype.get_token_sq_char_class = function() {
49264955
var r = this.reader.read_alpha();
49274956
if (this.reader.p(0) == ":" && this.reader.p(1) == "]") {
49284957
this.reader.seek_cur(2);
4929-
var __c12 = class_names;
4930-
for (var __i12 = 0; __i12 < __c12.length; ++__i12) {
4931-
var name = __c12[__i12];
4958+
var __c11 = class_names;
4959+
for (var __i11 = 0; __i11 < __c11.length; ++__i11) {
4960+
var name = __c11[__i11];
49324961
if (r == name) {
49334962
return "[:" + name + ":]";
49344963
}
@@ -5061,9 +5090,9 @@ RegexpParser.prototype.getoctchrs = function() {
50615090

50625091
RegexpParser.prototype.gethexchrs = function(n) {
50635092
var r = "";
5064-
var __c13 = viml_range(n);
5065-
for (var __i13 = 0; __i13 < __c13.length; ++__i13) {
5066-
var i = __c13[__i13];
5093+
var __c12 = viml_range(n);
5094+
for (var __i12 = 0; __i12 < __c12.length; ++__i12) {
5095+
var i = __c12[__i12];
50675096
var c = this.reader.peek();
50685097
if (!isxdigit(c)) {
50695098
break;

py/vimlparser.py

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ def viml_type(obj):
264264
NODE_CURLYNAME = 87
265265
NODE_ENV = 88
266266
NODE_REG = 89
267+
NODE_CURLYNAMEPART = 90
268+
NODE_CURLYNAMEEXPR = 91
267269
TOKEN_EOF = 1
268270
TOKEN_EOL = 2
269271
TOKEN_SPACE = 3
@@ -507,6 +509,8 @@ def ExArg():
507509
# CURLYNAME .value
508510
# ENV .value
509511
# REG .value
512+
# CURLYNAMEPART .value
513+
# CURLYNAMEEXPR .value
510514
def Node(type):
511515
return AttributeDict({"type":type})
512516

@@ -2494,38 +2498,59 @@ def parse_dot(self, token, left):
24942498
return node
24952499

24962500
def parse_identifier(self):
2497-
id = []
24982501
self.reader.skip_white()
24992502
npos = self.reader.getpos()
2503+
curly_parts = self.parse_curly_parts()
2504+
if viml_len(curly_parts) == 1 and curly_parts[0].type == NODE_CURLYNAMEPART:
2505+
node = Node(NODE_IDENTIFIER)
2506+
node.pos = npos
2507+
node.value = curly_parts[0].value
2508+
else:
2509+
node = Node(NODE_CURLYNAME)
2510+
node.pos = npos
2511+
node.value = curly_parts
2512+
return node
2513+
2514+
def parse_curly_parts(self):
2515+
curly_parts = []
25002516
c = self.reader.peek()
2517+
pos = self.reader.getpos()
25012518
if c == "<" and viml_equalci(self.reader.peekn(5), "<SID>"):
25022519
name = self.reader.getn(5)
2503-
viml_add(id, AttributeDict({"curly":0, "value":name}))
2520+
node = Node(NODE_CURLYNAMEPART)
2521+
node.curly = 0
2522+
# Keep backword compatibility for the curly attribute
2523+
node.pos = pos
2524+
node.value = name
2525+
viml_add(curly_parts, node)
25042526
while 1:
25052527
c = self.reader.peek()
25062528
if isnamec(c):
2529+
pos = self.reader.getpos()
25072530
name = self.reader.read_name()
2508-
viml_add(id, AttributeDict({"curly":0, "value":name}))
2531+
node = Node(NODE_CURLYNAMEPART)
2532+
node.curly = 0
2533+
# Keep backword compatibility for the curly attribute
2534+
node.pos = pos
2535+
node.value = name
2536+
viml_add(curly_parts, node)
25092537
elif c == "{":
25102538
self.reader.get()
2511-
node = self.parse_expr1()
2539+
pos = self.reader.getpos()
2540+
node = Node(NODE_CURLYNAMEEXPR)
2541+
node.curly = 1
2542+
# Keep backword compatibility for the curly attribute
2543+
node.pos = pos
2544+
node.value = self.parse_expr1()
2545+
viml_add(curly_parts, node)
25122546
self.reader.skip_white()
25132547
c = self.reader.p(0)
25142548
if c != "}":
25152549
raise Exception(Err(viml_printf("unexpected token: %s", c), self.reader.getpos()))
25162550
self.reader.seek_cur(1)
2517-
viml_add(id, AttributeDict({"curly":1, "value":node}))
25182551
else:
25192552
break
2520-
if viml_len(id) == 1 and id[0].curly == 0:
2521-
node = Node(NODE_IDENTIFIER)
2522-
node.pos = npos
2523-
node.value = id[0].value
2524-
else:
2525-
node = Node(NODE_CURLYNAME)
2526-
node.pos = npos
2527-
node.value = id
2528-
return node
2553+
return curly_parts
25292554

25302555
class LvalueParser(ExprParser):
25312556
def parse(self):
@@ -2979,6 +3004,10 @@ def compile(self, node):
29793004
return self.compile_env(node)
29803005
elif node.type == NODE_REG:
29813006
return self.compile_reg(node)
3007+
elif node.type == NODE_CURLYNAMEPART:
3008+
return self.compile_curlynamepart(node)
3009+
elif node.type == NODE_CURLYNAMEEXPR:
3010+
return self.compile_curlynameexpr(node)
29823011
else:
29833012
raise Exception(viml_printf("Compiler: unknown node: %s", viml_string(node)))
29843013

@@ -3318,20 +3347,20 @@ def compile_identifier(self, node):
33183347
return node.value
33193348

33203349
def compile_curlyname(self, node):
3321-
name = ""
3322-
for x in node.value:
3323-
if x.curly:
3324-
name += "{" + self.compile(x.value) + "}"
3325-
else:
3326-
name += x.value
3327-
return name
3350+
return viml_join([self.compile(vval) for vval in node.value], "")
33283351

33293352
def compile_env(self, node):
33303353
return node.value
33313354

33323355
def compile_reg(self, node):
33333356
return node.value
33343357

3358+
def compile_curlynamepart(self, node):
3359+
return node.value
3360+
3361+
def compile_curlynameexpr(self, node):
3362+
return "{" + self.compile(node.value) + "}"
3363+
33353364
# TODO: under construction
33363365
class RegexpParser:
33373366
RE_VERY_NOMAGIC = 1

0 commit comments

Comments
 (0)