Skip to content

Commit 8490339

Browse files
committed
Add blob type
1 parent 11d2bee commit 8490339

File tree

4 files changed

+86
-0
lines changed

4 files changed

+86
-0
lines changed

autoload/vimlparser.vim

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ let s:NODE_REG = 89
137137
let s:NODE_CURLYNAMEPART = 90
138138
let s:NODE_CURLYNAMEEXPR = 91
139139
let s:NODE_LAMBDA = 92
140+
let s:NODE_BLOB = 93
140141

141142
let s:TOKEN_EOF = 1
142143
let s:TOKEN_EOL = 2
@@ -203,6 +204,7 @@ let s:TOKEN_BACKTICK = 62
203204
let s:TOKEN_DOTDOTDOT = 63
204205
let s:TOKEN_SHARP = 64
205206
let s:TOKEN_ARROW = 65
207+
let s:TOKEN_BLOB = 66
206208

207209
let s:MAX_FUNC_ARGS = 20
208210

@@ -2580,6 +2582,10 @@ function! s:ExprTokenizer.get2()
25802582
let s = r.getn(3)
25812583
let s .= r.read_bdigit()
25822584
return self.token(s:TOKEN_NUMBER, s, pos)
2585+
elseif c ==# '0' && (r.p(1) ==# 'Z' || r.p(1) ==# 'z') && r.p(2) !=# '.'
2586+
let s = r.getn(3)
2587+
let s .= r.read_blob()
2588+
return self.token(s:TOKEN_BLOB, s, pos)
25832589
elseif s:isdigit(c)
25842590
let s = r.read_digit()
25852591
if r.p(0) ==# '.' && s:isdigit(r.p(1))
@@ -3374,6 +3380,10 @@ function! s:ExprParser.parse_expr9()
33743380
let node = s:Node(s:NODE_NUMBER)
33753381
let node.pos = token.pos
33763382
let node.value = token.value
3383+
elseif token.type == s:TOKEN_BLOB
3384+
let node = s:Node(s:NODE_BLOB)
3385+
let node.pos = token.pos
3386+
let node.value = token.value
33773387
elseif token.type == s:TOKEN_DQUOTE
33783388
call self.reader.seek_set(pos)
33793389
let node = s:Node(s:NODE_STRING)
@@ -3941,6 +3951,18 @@ function! s:StringReader.read_odigit()
39413951
return r
39423952
endfunction
39433953

3954+
function! s:StringReader.read_blob()
3955+
let r = ''
3956+
while 1
3957+
let c = self.peekn(1)
3958+
if !s:isxdigit(c) && c != '.'
3959+
break
3960+
endif
3961+
let r .= self.getn(1)
3962+
endwhile
3963+
return r
3964+
endfunction
3965+
39443966
function! s:StringReader.read_xdigit()
39453967
let r = ''
39463968
while s:isxdigit(self.peekn(1))
@@ -4213,6 +4235,8 @@ function! s:Compiler.compile(node)
42134235
return self.compile_call(a:node)
42144236
elseif a:node.type == s:NODE_NUMBER
42154237
return self.compile_number(a:node)
4238+
elseif a:node.type == s:NODE_BLOB
4239+
return self.compile_blob(a:node)
42164240
elseif a:node.type == s:NODE_STRING
42174241
return self.compile_string(a:node)
42184242
elseif a:node.type == s:NODE_LIST
@@ -4643,6 +4667,10 @@ function! s:Compiler.compile_number(node)
46434667
return a:node.value
46444668
endfunction
46454669

4670+
function! s:Compiler.compile_blob(node)
4671+
return a:node.value
4672+
endfunction
4673+
46464674
function! s:Compiler.compile_string(node)
46474675
return a:node.value
46484676
endfunction

js/vimlparser.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ var NODE_REG = 89;
327327
var NODE_CURLYNAMEPART = 90;
328328
var NODE_CURLYNAMEEXPR = 91;
329329
var NODE_LAMBDA = 92;
330+
var NODE_BLOB = 93;
330331
var TOKEN_EOF = 1;
331332
var TOKEN_EOL = 2;
332333
var TOKEN_SPACE = 3;
@@ -392,6 +393,7 @@ var TOKEN_BACKTICK = 62;
392393
var TOKEN_DOTDOTDOT = 63;
393394
var TOKEN_SHARP = 64;
394395
var TOKEN_ARROW = 65;
396+
var TOKEN_BLOB = 66;
395397
var MAX_FUNC_ARGS = 20;
396398
function isalpha(c) {
397399
return viml_eqregh(c, "^[A-Za-z]$");
@@ -2329,6 +2331,11 @@ ExprTokenizer.prototype.get2 = function() {
23292331
s += r.read_bdigit();
23302332
return this.token(TOKEN_NUMBER, s, pos);
23312333
}
2334+
else if (c == "0" && (r.p(1) == "Z" || r.p(1) == "z") && r.p(2) != ".") {
2335+
var s = r.getn(3);
2336+
s += r.read_blob();
2337+
return this.token(TOKEN_BLOB, s, pos);
2338+
}
23322339
else if (isdigit(c)) {
23332340
var s = r.read_digit();
23342341
if (r.p(0) == "." && isdigit(r.p(1))) {
@@ -3236,6 +3243,11 @@ ExprParser.prototype.parse_expr9 = function() {
32363243
node.pos = token.pos;
32373244
node.value = token.value;
32383245
}
3246+
else if (token.type == TOKEN_BLOB) {
3247+
var node = Node(NODE_BLOB);
3248+
node.pos = token.pos;
3249+
node.value = token.value;
3250+
}
32393251
else if (token.type == TOKEN_DQUOTE) {
32403252
this.reader.seek_set(pos);
32413253
var node = Node(NODE_STRING);
@@ -3846,6 +3858,18 @@ StringReader.prototype.read_odigit = function() {
38463858
return r;
38473859
}
38483860

3861+
StringReader.prototype.read_blob = function() {
3862+
var r = "";
3863+
while (1) {
3864+
var c = this.peekn(1);
3865+
if (!isxdigit(c) && c != ".") {
3866+
break;
3867+
}
3868+
r += this.getn(1);
3869+
}
3870+
return r;
3871+
}
3872+
38493873
StringReader.prototype.read_xdigit = function() {
38503874
var r = "";
38513875
while (isxdigit(this.peekn(1))) {
@@ -4185,6 +4209,9 @@ Compiler.prototype.compile = function(node) {
41854209
else if (node.type == NODE_NUMBER) {
41864210
return this.compile_number(node);
41874211
}
4212+
else if (node.type == NODE_BLOB) {
4213+
return this.compile_blob(node);
4214+
}
41884215
else if (node.type == NODE_STRING) {
41894216
return this.compile_string(node);
41904217
}
@@ -4640,6 +4667,10 @@ Compiler.prototype.compile_number = function(node) {
46404667
return node.value;
46414668
}
46424669

4670+
Compiler.prototype.compile_blob = function(node) {
4671+
return node.value;
4672+
}
4673+
46434674
Compiler.prototype.compile_string = function(node) {
46444675
return node.value;
46454676
}

py/pycompiler.vim

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ let s:opprec[s:NODE_SLICE] = 8
4949
let s:opprec[s:NODE_CALL] = 8
5050
let s:opprec[s:NODE_DOT] = 8
5151
let s:opprec[s:NODE_NUMBER] = 9
52+
let s:opprec[s:NODE_BLOB] = 9
5253
let s:opprec[s:NODE_STRING] = 9
5354
let s:opprec[s:NODE_LIST] = 9
5455
let s:opprec[s:NODE_DICT] = 9
@@ -274,6 +275,8 @@ function s:PythonCompiler.compile(node)
274275
return self.compile_call(a:node)
275276
elseif a:node.type == s:NODE_NUMBER
276277
return self.compile_number(a:node)
278+
elseif a:node.type == s:NODE_BLOB
279+
return self.compile_blob(a:node)
277280
elseif a:node.type == s:NODE_STRING
278281
return self.compile_string(a:node)
279282
elseif a:node.type == s:NODE_LIST

py/vimlparser.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ def viml_type(obj):
281281
NODE_CURLYNAMEPART = 90
282282
NODE_CURLYNAMEEXPR = 91
283283
NODE_LAMBDA = 92
284+
NODE_BLOB = 93
284285
TOKEN_EOF = 1
285286
TOKEN_EOL = 2
286287
TOKEN_SPACE = 3
@@ -346,6 +347,7 @@ def viml_type(obj):
346347
TOKEN_DOTDOTDOT = 63
347348
TOKEN_SHARP = 64
348349
TOKEN_ARROW = 65
350+
TOKEN_BLOB = 66
349351
MAX_FUNC_ARGS = 20
350352
def isalpha(c):
351353
return viml_eqregh(c, "^[A-Za-z]$")
@@ -1860,6 +1862,10 @@ def get2(self):
18601862
s = r.getn(3)
18611863
s += r.read_bdigit()
18621864
return self.token(TOKEN_NUMBER, s, pos)
1865+
elif c == "0" and (r.p(1) == "Z" or r.p(1) == "z") and r.p(2) != ".":
1866+
s = r.getn(3)
1867+
s += r.read_blob()
1868+
return self.token(TOKEN_BLOB, s, pos)
18631869
elif isdigit(c):
18641870
s = r.read_digit()
18651871
if r.p(0) == "." and isdigit(r.p(1)):
@@ -2583,6 +2589,10 @@ def parse_expr9(self):
25832589
node = Node(NODE_NUMBER)
25842590
node.pos = token.pos
25852591
node.value = token.value
2592+
elif token.type == TOKEN_BLOB:
2593+
node = Node(NODE_BLOB)
2594+
node.pos = token.pos
2595+
node.value = token.value
25862596
elif token.type == TOKEN_DQUOTE:
25872597
self.reader.seek_set(pos)
25882598
node = Node(NODE_STRING)
@@ -3057,6 +3067,15 @@ def read_odigit(self):
30573067
r += self.getn(1)
30583068
return r
30593069

3070+
def read_blob(self):
3071+
r = ""
3072+
while 1:
3073+
c = self.peekn(1)
3074+
if not isxdigit(c) and c != ".":
3075+
break
3076+
r += self.getn(1)
3077+
return r
3078+
30603079
def read_xdigit(self):
30613080
r = ""
30623081
while isxdigit(self.peekn(1)):
@@ -3297,6 +3316,8 @@ def compile(self, node):
32973316
return self.compile_call(node)
32983317
elif node.type == NODE_NUMBER:
32993318
return self.compile_number(node)
3319+
elif node.type == NODE_BLOB:
3320+
return self.compile_blob(node)
33003321
elif node.type == NODE_STRING:
33013322
return self.compile_string(node)
33023323
elif node.type == NODE_LIST:
@@ -3637,6 +3658,9 @@ def compile_call(self, node):
36373658
def compile_number(self, node):
36383659
return node.value
36393660

3661+
def compile_blob(self, node):
3662+
return node.value
3663+
36403664
def compile_string(self, node):
36413665
return node.value
36423666

0 commit comments

Comments
 (0)