Skip to content

Commit 233e7ea

Browse files
committed
Merge pull request #13 from Kuniwak/curly-part-node
[WIP] NODE_CURLYNAME children should be also Nodes
2 parents cc8488d + 27d0c05 commit 233e7ea

File tree

3 files changed

+164
-79
lines changed

3 files changed

+164
-79
lines changed

autoload/vimlparser.vim

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ let s:NODE_IDENTIFIER = 86
127127
let s:NODE_CURLYNAME = 87
128128
let s:NODE_ENV = 88
129129
let s:NODE_REG = 89
130+
let s:NODE_CURLYNAMEPART = 90
131+
let s:NODE_CURLYNAMEEXPR = 91
130132

131133
let s:TOKEN_EOF = 1
132134
let s:TOKEN_EOL = 2
@@ -389,6 +391,8 @@ endfunction
389391
" CURLYNAME .value
390392
" ENV .value
391393
" REG .value
394+
" CURLYNAMEPART .value
395+
" CURLYNAMEEXPR .value
392396
function! s:Node(type)
393397
return {'type': a:type}
394398
endfunction
@@ -3257,43 +3261,62 @@ function! s:ExprParser.parse_dot(token, left)
32573261
endfunction
32583262

32593263
function! s:ExprParser.parse_identifier()
3260-
let id = []
32613264
call self.reader.skip_white()
32623265
let npos = self.reader.getpos()
3266+
let curly_parts = self.parse_curly_parts()
3267+
if len(curly_parts) == 1 && curly_parts[0].type == s:NODE_CURLYNAMEPART
3268+
let node = s:Node(s:NODE_IDENTIFIER)
3269+
let node.pos = npos
3270+
let node.value = curly_parts[0].value
3271+
else
3272+
let node = s:Node(s:NODE_CURLYNAME)
3273+
let node.pos = npos
3274+
let node.value = curly_parts
3275+
endif
3276+
return node
3277+
endfunction
3278+
3279+
function! s:ExprParser.parse_curly_parts()
3280+
let curly_parts = []
32633281
let c = self.reader.peek()
3282+
let pos = self.reader.getpos()
32643283
if c ==# '<' && self.reader.peekn(5) ==? '<SID>'
32653284
let name = self.reader.getn(5)
3266-
call add(id, {'curly': 0, 'value': name})
3285+
let node = s:Node(s:NODE_CURLYNAMEPART)
3286+
let node.curly = 0 " Keep backword compatibility for the curly attribute
3287+
let node.pos = pos
3288+
let node.value = name
3289+
call add(curly_parts, node)
32673290
endif
32683291
while 1
32693292
let c = self.reader.peek()
32703293
if s:isnamec(c)
3294+
let pos = self.reader.getpos()
32713295
let name = self.reader.read_name()
3272-
call add(id, {'curly': 0, 'value': name})
3296+
let node = s:Node(s:NODE_CURLYNAMEPART)
3297+
let node.curly = 0 " Keep backword compatibility for the curly attribute
3298+
let node.pos = pos
3299+
let node.value = name
3300+
call add(curly_parts, node)
32733301
elseif c ==# '{'
32743302
call self.reader.get()
3275-
let node = self.parse_expr1()
3303+
let pos = self.reader.getpos()
3304+
let node = s:Node(s:NODE_CURLYNAMEEXPR)
3305+
let node.curly = 1 " Keep backword compatibility for the curly attribute
3306+
let node.pos = pos
3307+
let node.value = self.parse_expr1()
3308+
call add(curly_parts, node)
32763309
call self.reader.skip_white()
32773310
let c = self.reader.p(0)
32783311
if c !=# '}'
32793312
throw s:Err(printf('unexpected token: %s', c), self.reader.getpos())
32803313
endif
32813314
call self.reader.seek_cur(1)
3282-
call add(id, {'curly': 1, 'value': node})
32833315
else
32843316
break
32853317
endif
32863318
endwhile
3287-
if len(id) == 1 && id[0].curly == 0
3288-
let node = s:Node(s:NODE_IDENTIFIER)
3289-
let node.pos = npos
3290-
let node.value = id[0].value
3291-
else
3292-
let node = s:Node(s:NODE_CURLYNAME)
3293-
let node.pos = npos
3294-
let node.value = id
3295-
endif
3296-
return node
3319+
return curly_parts
32973320
endfunction
32983321

32993322
let s:LvalueParser = copy(s:ExprParser)
@@ -3838,6 +3861,10 @@ function! s:Compiler.compile(node)
38383861
return self.compile_env(a:node)
38393862
elseif a:node.type == s:NODE_REG
38403863
return self.compile_reg(a:node)
3864+
elseif a:node.type == s:NODE_CURLYNAMEPART
3865+
return self.compile_curlynamepart(a:node)
3866+
elseif a:node.type == s:NODE_CURLYNAMEEXPR
3867+
return self.compile_curlynameexpr(a:node)
38413868
else
38423869
throw printf('Compiler: unknown node: %s', string(a:node))
38433870
endif
@@ -4274,15 +4301,7 @@ function! s:Compiler.compile_identifier(node)
42744301
endfunction
42754302

42764303
function! s:Compiler.compile_curlyname(node)
4277-
let name = ''
4278-
for x in a:node.value
4279-
if x.curly
4280-
let name .= '{' . self.compile(x.value) . '}'
4281-
else
4282-
let name .= x.value
4283-
endif
4284-
endfor
4285-
return name
4304+
return join(map(a:node.value, 'self.compile(v:val)'), '')
42864305
endfunction
42874306

42884307
function! s:Compiler.compile_env(node)
@@ -4293,6 +4312,14 @@ function! s:Compiler.compile_reg(node)
42934312
return a:node.value
42944313
endfunction
42954314

4315+
function! s:Compiler.compile_curlynamepart(node)
4316+
return a:node.value
4317+
endfunction
4318+
4319+
function! s:Compiler.compile_curlynameexpr(node)
4320+
return '{' . self.compile(a:node.value) . '}'
4321+
endfunction
4322+
42964323
" TODO: under construction
42974324
let s:RegexpParser = {}
42984325

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;

0 commit comments

Comments
 (0)