Skip to content

Commit 04342b9

Browse files
committed
Merge remote-tracking branch 'origin/master' into add-method-op
2 parents fa21f27 + c91b43a commit 04342b9

File tree

6 files changed

+266
-12
lines changed

6 files changed

+266
-12
lines changed

autoload/vimlparser.vim

Lines changed: 84 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ let s:NODE_LAMBDA = 92
140140
let s:NODE_BLOB = 93
141141
let s:NODE_CONST = 94
142142
let s:NODE_EVAL = 95
143-
let s:NODE_METHOD = 96
143+
let s:NODE_HEREDOC = 96
144+
let s:NODE_METHOD = 97
144145

145146
let s:TOKEN_EOF = 1
146147
let s:TOKEN_EOL = 2
@@ -210,6 +211,7 @@ let s:TOKEN_ARROW = 65
210211
let s:TOKEN_BLOB = 66
211212
let s:TOKEN_LITCOPEN = 67
212213
let s:TOKEN_DOTDOT = 68
214+
let s:TOKEN_HEREDOC = 69
213215

214216
let s:MAX_FUNC_ARGS = 20
215217

@@ -414,6 +416,7 @@ endfunction
414416
" CURLYNAMEPART .value
415417
" CURLYNAMEEXPR .value
416418
" LAMBDA .rlist .left
419+
" HEREDOC .rlist .op .body
417420
function! s:Node(type) abort
418421
return {'type': a:type}
419422
endfunction
@@ -1502,6 +1505,44 @@ function! s:VimLParser.parse_cmd_call() abort
15021505
call self.add_node(node)
15031506
endfunction
15041507

1508+
function! s:VimLParser.parse_heredoc() abort
1509+
let node = s:Node(s:NODE_HEREDOC)
1510+
let node.pos = self.ea.cmdpos
1511+
let node.op = ''
1512+
let node.rlist = []
1513+
let node.body = []
1514+
1515+
while s:TRUE
1516+
call self.reader.skip_white()
1517+
let key = self.reader.read_word()
1518+
if key == ''
1519+
break
1520+
endif
1521+
if !s:islower(key[0])
1522+
let node.op = key
1523+
break
1524+
else
1525+
call add(node.rlist, key)
1526+
endif
1527+
endwhile
1528+
if node.op ==# ''
1529+
throw s:Err('E172: Missing marker', self.reader.getpos())
1530+
endif
1531+
call self.parse_trail()
1532+
while s:TRUE
1533+
if self.reader.peek() ==# '<EOF>'
1534+
break
1535+
endif
1536+
let line = self.reader.getn(-1)
1537+
if line ==# node.op
1538+
return node
1539+
endif
1540+
call add(node.body, line)
1541+
call self.reader.get()
1542+
endwhile
1543+
throw s:Err(printf("E990: Missing end marker '%s'", node.op), self.reader.getpos())
1544+
endfunction
1545+
15051546
function! s:VimLParser.parse_cmd_let() abort
15061547
let pos = self.reader.tell()
15071548
call self.reader.skip_white()
@@ -1520,10 +1561,12 @@ function! s:VimLParser.parse_cmd_let() abort
15201561
" TODO check scriptversion?
15211562
if s2 ==# '..'
15221563
let s2 = self.reader.peekn(3)
1564+
elseif s2 ==# '=<'
1565+
let s2 = self.reader.peekn(3)
15231566
endif
15241567

15251568
" :let {var-name} ..
1526-
if self.ends_excmds(s1) || (s2 !=# '+=' && s2 !=# '-=' && s2 !=# '.=' && s2 !=# '..=' && s2 !=# '*=' && s2 !=# '/=' && s2 !=# '%=' && s1 !=# '=')
1569+
if self.ends_excmds(s1) || (s2 !=# '+=' && s2 !=# '-=' && s2 !=# '.=' && s2 !=# '..=' && s2 !=# '*=' && s2 !=# '/=' && s2 !=# '%=' && s2 !=# '=<<' && s1 !=# '=')
15271570
call self.reader.seek_set(pos)
15281571
call self.parse_cmd_common()
15291572
return
@@ -1541,6 +1584,13 @@ function! s:VimLParser.parse_cmd_let() abort
15411584
if s2 ==# '+=' || s2 ==# '-=' || s2 ==# '.=' || s2 ==# '..=' || s2 ==# '*=' || s2 ==# '/=' || s2 ==# '%='
15421585
call self.reader.getn(len(s2))
15431586
let node.op = s2
1587+
elseif s2 ==# '=<<'
1588+
call self.reader.getn(len(s2))
1589+
call self.reader.skip_white()
1590+
let node.op = s2
1591+
let node.right = self.parse_heredoc()
1592+
call self.add_node(node)
1593+
return
15441594
elseif s1 ==# '='
15451595
call self.reader.getn(1)
15461596
let node.op = s1
@@ -4976,6 +5026,8 @@ function! s:Compiler.compile(node) abort
49765026
return self.compile_curlynameexpr(a:node)
49775027
elseif a:node.type ==# s:NODE_LAMBDA
49785028
return self.compile_lambda(a:node)
5029+
elseif a:node.type == s:NODE_HEREDOC
5030+
return self.compile_heredoc(a:node)
49795031
else
49805032
throw printf('Compiler: unknown node: %s', string(a:node))
49815033
endif
@@ -5473,11 +5525,41 @@ function! s:Compiler.compile_curlynameexpr(node) abort
54735525
return '{' . self.compile(a:node.value) . '}'
54745526
endfunction
54755527

5528+
function! s:Compiler.escape_string(str) abort
5529+
let m = {"\n": '\n', "\t": '\t', "\r": '\r'}
5530+
let out = '"'
5531+
for i in range(len(a:str))
5532+
let c = a:str[i]
5533+
if has_key(m, c)
5534+
let out .= m[c]
5535+
else
5536+
let out .= c
5537+
endif
5538+
endfor
5539+
let out .= '"'
5540+
return out
5541+
endfunction
5542+
54765543
function! s:Compiler.compile_lambda(node) abort
54775544
let rlist = map(a:node.rlist, 'self.compile(v:val)')
54785545
return printf('(lambda (%s) %s)', join(rlist, ' '), self.compile(a:node.left))
54795546
endfunction
54805547

5548+
function! s:Compiler.compile_heredoc(node) abort
5549+
if empty(a:node.rlist)
5550+
let rlist = '(list)'
5551+
else
5552+
let rlist = '(list ' . join(map(a:node.rlist, 'self.escape_string(v:val)'), ' ') . ')'
5553+
endif
5554+
if empty(a:node.body)
5555+
let body = '(list)'
5556+
else
5557+
let body = '(list ' . join(map(a:node.body, 'self.escape_string(v:val)'), ' ') . ')'
5558+
endif
5559+
let op = self.escape_string(a:node.op)
5560+
return printf('(heredoc %s %s %s)', rlist, op, body)
5561+
endfunction
5562+
54815563
" TODO: under construction
54825564
let s:RegexpParser = {}
54835565

js/vimlparser.js

Lines changed: 98 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,8 @@ var NODE_LAMBDA = 92;
321321
var NODE_BLOB = 93;
322322
var NODE_CONST = 94;
323323
var NODE_EVAL = 95;
324-
var NODE_METHOD = 96;
324+
var NODE_HEREDOC = 96;
325+
var NODE_METHOD = 97;
325326
var TOKEN_EOF = 1;
326327
var TOKEN_EOL = 2;
327328
var TOKEN_SPACE = 3;
@@ -390,6 +391,7 @@ var TOKEN_ARROW = 65;
390391
var TOKEN_BLOB = 66;
391392
var TOKEN_LITCOPEN = 67;
392393
var TOKEN_DOTDOT = 68;
394+
var TOKEN_HEREDOC = 69;
393395
var MAX_FUNC_ARGS = 20;
394396
function isalpha(c) {
395397
return viml_eqregh(c, "^[A-Za-z]$");
@@ -592,6 +594,7 @@ function ExArg() {
592594
// CURLYNAMEPART .value
593595
// CURLYNAMEEXPR .value
594596
// LAMBDA .rlist .left
597+
// HEREDOC .rlist .op .body
595598
function Node(type) {
596599
return {"type":type};
597600
}
@@ -1797,6 +1800,44 @@ VimLParser.prototype.parse_cmd_call = function() {
17971800
this.add_node(node);
17981801
}
17991802

1803+
VimLParser.prototype.parse_heredoc = function() {
1804+
var node = Node(NODE_HEREDOC);
1805+
node.pos = this.ea.cmdpos;
1806+
node.op = "";
1807+
node.rlist = [];
1808+
node.body = [];
1809+
while (TRUE) {
1810+
this.reader.skip_white();
1811+
var key = this.reader.read_word();
1812+
if (key == "") {
1813+
break;
1814+
}
1815+
if (!islower(key[0])) {
1816+
node.op = key;
1817+
break;
1818+
}
1819+
else {
1820+
viml_add(node.rlist, key);
1821+
}
1822+
}
1823+
if (node.op == "") {
1824+
throw Err("E172: Missing marker", this.reader.getpos());
1825+
}
1826+
this.parse_trail();
1827+
while (TRUE) {
1828+
if (this.reader.peek() == "<EOF>") {
1829+
break;
1830+
}
1831+
var line = this.reader.getn(-1);
1832+
if (line == node.op) {
1833+
return node;
1834+
}
1835+
viml_add(node.body, line);
1836+
this.reader.get();
1837+
}
1838+
throw Err(viml_printf("E990: Missing end marker '%s'", node.op), this.reader.getpos());
1839+
}
1840+
18001841
VimLParser.prototype.parse_cmd_let = function() {
18011842
var pos = this.reader.tell();
18021843
this.reader.skip_white();
@@ -1814,8 +1855,11 @@ VimLParser.prototype.parse_cmd_let = function() {
18141855
if (s2 == "..") {
18151856
var s2 = this.reader.peekn(3);
18161857
}
1858+
else if (s2 == "=<") {
1859+
var s2 = this.reader.peekn(3);
1860+
}
18171861
// :let {var-name} ..
1818-
if (this.ends_excmds(s1) || s2 != "+=" && s2 != "-=" && s2 != ".=" && s2 != "..=" && s2 != "*=" && s2 != "/=" && s2 != "%=" && s1 != "=") {
1862+
if (this.ends_excmds(s1) || s2 != "+=" && s2 != "-=" && s2 != ".=" && s2 != "..=" && s2 != "*=" && s2 != "/=" && s2 != "%=" && s2 != "=<<" && s1 != "=") {
18191863
this.reader.seek_set(pos);
18201864
this.parse_cmd_common();
18211865
return;
@@ -1833,6 +1877,14 @@ VimLParser.prototype.parse_cmd_let = function() {
18331877
this.reader.getn(viml_len(s2));
18341878
node.op = s2;
18351879
}
1880+
else if (s2 == "=<<") {
1881+
this.reader.getn(viml_len(s2));
1882+
this.reader.skip_white();
1883+
node.op = s2;
1884+
node.right = this.parse_heredoc();
1885+
this.add_node(node);
1886+
return;
1887+
}
18361888
else if (s1 == "=") {
18371889
this.reader.getn(1);
18381890
node.op = s1;
@@ -4481,6 +4533,9 @@ Compiler.prototype.compile = function(node) {
44814533
else if (node.type == NODE_LAMBDA) {
44824534
return this.compile_lambda(node);
44834535
}
4536+
else if (node.type == NODE_HEREDOC) {
4537+
return this.compile_heredoc(node);
4538+
}
44844539
else {
44854540
throw viml_printf("Compiler: unknown node: %s", viml_string(node));
44864541
}
@@ -4997,11 +5052,46 @@ Compiler.prototype.compile_curlynameexpr = function(node) {
49975052
return "{" + this.compile(node.value) + "}";
49985053
}
49995054

5055+
Compiler.prototype.escape_string = function(str) {
5056+
var m = {"\n":"\\n", "\t":"\\t", "\r":"\\r"};
5057+
var out = "\"";
5058+
var __c14 = viml_range(viml_len(str));
5059+
for (var __i14 = 0; __i14 < __c14.length; ++__i14) {
5060+
var i = __c14[__i14];
5061+
var c = str[i];
5062+
if (viml_has_key(m, c)) {
5063+
out += m[c];
5064+
}
5065+
else {
5066+
out += c;
5067+
}
5068+
}
5069+
out += "\"";
5070+
return out;
5071+
}
5072+
50005073
Compiler.prototype.compile_lambda = function(node) {
50015074
var rlist = node.rlist.map((function(vval) { return this.compile(vval); }).bind(this));
50025075
return viml_printf("(lambda (%s) %s)", viml_join(rlist, " "), this.compile(node.left));
50035076
}
50045077

5078+
Compiler.prototype.compile_heredoc = function(node) {
5079+
if (viml_empty(node.rlist)) {
5080+
var rlist = "(list)";
5081+
}
5082+
else {
5083+
var rlist = "(list " + viml_join(node.rlist.map((function(vval) { return this.escape_string(vval); }).bind(this)), " ") + ")";
5084+
}
5085+
if (viml_empty(node.body)) {
5086+
var body = "(list)";
5087+
}
5088+
else {
5089+
var body = "(list " + viml_join(node.body.map((function(vval) { return this.escape_string(vval); }).bind(this)), " ") + ")";
5090+
}
5091+
var op = this.escape_string(node.op);
5092+
return viml_printf("(heredoc %s %s %s)", rlist, op, body);
5093+
}
5094+
50055095
// TODO: under construction
50065096
function RegexpParser() { this.__init__.apply(this, arguments); }
50075097
RegexpParser.prototype.RE_VERY_NOMAGIC = 1;
@@ -5682,9 +5772,9 @@ RegexpParser.prototype.get_token_sq_char_class = function() {
56825772
var r = this.reader.read_alpha();
56835773
if (this.reader.p(0) == ":" && this.reader.p(1) == "]") {
56845774
this.reader.seek_cur(2);
5685-
var __c14 = class_names;
5686-
for (var __i14 = 0; __i14 < __c14.length; ++__i14) {
5687-
var name = __c14[__i14];
5775+
var __c15 = class_names;
5776+
for (var __i15 = 0; __i15 < __c15.length; ++__i15) {
5777+
var name = __c15[__i15];
56885778
if (r == name) {
56895779
return "[:" + name + ":]";
56905780
}
@@ -5817,9 +5907,9 @@ RegexpParser.prototype.getoctchrs = function() {
58175907

58185908
RegexpParser.prototype.gethexchrs = function(n) {
58195909
var r = "";
5820-
var __c15 = viml_range(n);
5821-
for (var __i15 = 0; __i15 < __c15.length; ++__i15) {
5822-
var i = __c15[__i15];
5910+
var __c16 = viml_range(n);
5911+
for (var __i16 = 0; __i16 < __c16.length; ++__i16) {
5912+
var i = __c16[__i16];
58235913
var c = this.reader.peek();
58245914
if (!isxdigit(c)) {
58255915
break;

py/vimlfunc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class AttributeDict(dict):
9090
"^[0-9A-Fa-f][0-9A-Fa-f]$": "^[0-9A-Fa-f][0-9A-Fa-f]$",
9191
r"^\.[0-9A-Fa-f]$": r"^\.[0-9A-Fa-f]$",
9292
"^[0-9A-Fa-f][^0-9A-Fa-f]$": "^[0-9A-Fa-f][^0-9A-Fa-f]$",
93+
"^[^a-z]\\S\\+$": "^[^a-z]\\S\\+$",
9394
}
9495

9596

0 commit comments

Comments
 (0)