Skip to content

Commit 19cda80

Browse files
authored
Merge pull request #92 from vim-jp/add-blob
Add blob type
2 parents 8851f8e + 5ddc57a commit 19cda80

File tree

10 files changed

+137
-0
lines changed

10 files changed

+137
-0
lines changed

autoload/vimlparser.vim

Lines changed: 33 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(2)
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,23 @@ 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 s = self.peekn(2)
3958+
if s =~# '^[0-9A-Fa-f][0-9A-Fa-f]$'
3959+
let r .= self.getn(2)
3960+
elseif s =~# '^\.[0-9A-Fa-f]$'
3961+
let r .= self.getn(1)
3962+
elseif s =~# '^[0-9A-Fa-f][^0-9A-Fa-f]$'
3963+
throw s:Err('E973: Blob literal should have an even number of hex characters:' . s, self.getpos())
3964+
else
3965+
break
3966+
endif
3967+
endwhile
3968+
return r
3969+
endfunction
3970+
39443971
function! s:StringReader.read_xdigit()
39453972
let r = ''
39463973
while s:isxdigit(self.peekn(1))
@@ -4213,6 +4240,8 @@ function! s:Compiler.compile(node)
42134240
return self.compile_call(a:node)
42144241
elseif a:node.type == s:NODE_NUMBER
42154242
return self.compile_number(a:node)
4243+
elseif a:node.type == s:NODE_BLOB
4244+
return self.compile_blob(a:node)
42164245
elseif a:node.type == s:NODE_STRING
42174246
return self.compile_string(a:node)
42184247
elseif a:node.type == s:NODE_LIST
@@ -4643,6 +4672,10 @@ function! s:Compiler.compile_number(node)
46434672
return a:node.value
46444673
endfunction
46454674

4675+
function! s:Compiler.compile_blob(node)
4676+
return a:node.value
4677+
endfunction
4678+
46464679
function! s:Compiler.compile_string(node)
46474680
return a:node.value
46484681
endfunction

js/vimlfunc.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ var pat_vim2js = {
8484
"^[a-z]$" : "^[a-z]$",
8585
"^[vgslabwt]:$\\|^\\([vgslabwt]:\\)\\?[A-Za-z_][0-9A-Za-z_#]*$" : "^[vgslabwt]:$|^([vgslabwt]:)?[A-Za-z_][0-9A-Za-z_#]*$",
8686
"^[0-7]$" : "^[0-7]$",
87+
"^[0-9A-Fa-f][0-9A-Fa-f]$" : "^[0-9A-Fa-f][0-9A-Fa-f]$",
88+
"^\\.[0-9A-Fa-f]$" : "^\\.[0-9A-Fa-f]$",
89+
"^[0-9A-Fa-f][^0-9A-Fa-f]$" : "^[0-9A-Fa-f][^0-9A-Fa-f]$",
8790
}
8891

8992
function viml_add(lst, item) {

js/vimlparser.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ var pat_vim2js = {
8484
"^[a-z]$" : "^[a-z]$",
8585
"^[vgslabwt]:$\\|^\\([vgslabwt]:\\)\\?[A-Za-z_][0-9A-Za-z_#]*$" : "^[vgslabwt]:$|^([vgslabwt]:)?[A-Za-z_][0-9A-Za-z_#]*$",
8686
"^[0-7]$" : "^[0-7]$",
87+
"^[0-9A-Fa-f][0-9A-Fa-f]$" : "^[0-9A-Fa-f][0-9A-Fa-f]$",
88+
"^\\.[0-9A-Fa-f]$" : "^\\.[0-9A-Fa-f]$",
89+
"^[0-9A-Fa-f][^0-9A-Fa-f]$" : "^[0-9A-Fa-f][^0-9A-Fa-f]$",
8790
}
8891

8992
function viml_add(lst, item) {
@@ -327,6 +330,7 @@ var NODE_REG = 89;
327330
var NODE_CURLYNAMEPART = 90;
328331
var NODE_CURLYNAMEEXPR = 91;
329332
var NODE_LAMBDA = 92;
333+
var NODE_BLOB = 93;
330334
var TOKEN_EOF = 1;
331335
var TOKEN_EOL = 2;
332336
var TOKEN_SPACE = 3;
@@ -392,6 +396,7 @@ var TOKEN_BACKTICK = 62;
392396
var TOKEN_DOTDOTDOT = 63;
393397
var TOKEN_SHARP = 64;
394398
var TOKEN_ARROW = 65;
399+
var TOKEN_BLOB = 66;
395400
var MAX_FUNC_ARGS = 20;
396401
function isalpha(c) {
397402
return viml_eqregh(c, "^[A-Za-z]$");
@@ -2329,6 +2334,11 @@ ExprTokenizer.prototype.get2 = function() {
23292334
s += r.read_bdigit();
23302335
return this.token(TOKEN_NUMBER, s, pos);
23312336
}
2337+
else if (c == "0" && (r.p(1) == "Z" || r.p(1) == "z") && r.p(2) != ".") {
2338+
var s = r.getn(2);
2339+
s += r.read_blob();
2340+
return this.token(TOKEN_BLOB, s, pos);
2341+
}
23322342
else if (isdigit(c)) {
23332343
var s = r.read_digit();
23342344
if (r.p(0) == "." && isdigit(r.p(1))) {
@@ -3236,6 +3246,11 @@ ExprParser.prototype.parse_expr9 = function() {
32363246
node.pos = token.pos;
32373247
node.value = token.value;
32383248
}
3249+
else if (token.type == TOKEN_BLOB) {
3250+
var node = Node(NODE_BLOB);
3251+
node.pos = token.pos;
3252+
node.value = token.value;
3253+
}
32393254
else if (token.type == TOKEN_DQUOTE) {
32403255
this.reader.seek_set(pos);
32413256
var node = Node(NODE_STRING);
@@ -3846,6 +3861,26 @@ StringReader.prototype.read_odigit = function() {
38463861
return r;
38473862
}
38483863

3864+
StringReader.prototype.read_blob = function() {
3865+
var r = "";
3866+
while (1) {
3867+
var s = this.peekn(2);
3868+
if (viml_eqregh(s, "^[0-9A-Fa-f][0-9A-Fa-f]$")) {
3869+
r += this.getn(2);
3870+
}
3871+
else if (viml_eqregh(s, "^\\.[0-9A-Fa-f]$")) {
3872+
r += this.getn(1);
3873+
}
3874+
else if (viml_eqregh(s, "^[0-9A-Fa-f][^0-9A-Fa-f]$")) {
3875+
throw Err("E973: Blob literal should have an even number of hex characters:" + s, this.getpos());
3876+
}
3877+
else {
3878+
break;
3879+
}
3880+
}
3881+
return r;
3882+
}
3883+
38493884
StringReader.prototype.read_xdigit = function() {
38503885
var r = "";
38513886
while (isxdigit(this.peekn(1))) {
@@ -4185,6 +4220,9 @@ Compiler.prototype.compile = function(node) {
41854220
else if (node.type == NODE_NUMBER) {
41864221
return this.compile_number(node);
41874222
}
4223+
else if (node.type == NODE_BLOB) {
4224+
return this.compile_blob(node);
4225+
}
41884226
else if (node.type == NODE_STRING) {
41894227
return this.compile_string(node);
41904228
}
@@ -4640,6 +4678,10 @@ Compiler.prototype.compile_number = function(node) {
46404678
return node.value;
46414679
}
46424680

4681+
Compiler.prototype.compile_blob = function(node) {
4682+
return node.value;
4683+
}
4684+
46434685
Compiler.prototype.compile_string = function(node) {
46444686
return node.value;
46454687
}

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/vimlfunc.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ class AttributeDict(dict):
8080
"^[a-z]$" : "^[a-z]$",
8181
"^[vgslabwt]:$\\|^\\([vgslabwt]:\\)\\?[A-Za-z_][0-9A-Za-z_#]*$" : "^[vgslabwt]:$|^([vgslabwt]:)?[A-Za-z_][0-9A-Za-z_#]*$",
8282
"^[0-7]$" : "^[0-7]$",
83+
"^[0-9A-Fa-f][0-9A-Fa-f]$" : "^[0-9A-Fa-f][0-9A-Fa-f]$",
84+
"^\.[0-9A-Fa-f]$" : "^\.[0-9A-Fa-f]$",
85+
"^[0-9A-Fa-f][^0-9A-Fa-f]$" : "^[0-9A-Fa-f][^0-9A-Fa-f]$",
8386
}
8487

8588
def viml_add(lst, item):

py/vimlparser.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ class AttributeDict(dict):
8080
"^[a-z]$" : "^[a-z]$",
8181
"^[vgslabwt]:$\\|^\\([vgslabwt]:\\)\\?[A-Za-z_][0-9A-Za-z_#]*$" : "^[vgslabwt]:$|^([vgslabwt]:)?[A-Za-z_][0-9A-Za-z_#]*$",
8282
"^[0-7]$" : "^[0-7]$",
83+
"^[0-9A-Fa-f][0-9A-Fa-f]$" : "^[0-9A-Fa-f][0-9A-Fa-f]$",
84+
"^\.[0-9A-Fa-f]$" : "^\.[0-9A-Fa-f]$",
85+
"^[0-9A-Fa-f][^0-9A-Fa-f]$" : "^[0-9A-Fa-f][^0-9A-Fa-f]$",
8386
}
8487

8588
def viml_add(lst, item):
@@ -281,6 +284,7 @@ def viml_type(obj):
281284
NODE_CURLYNAMEPART = 90
282285
NODE_CURLYNAMEEXPR = 91
283286
NODE_LAMBDA = 92
287+
NODE_BLOB = 93
284288
TOKEN_EOF = 1
285289
TOKEN_EOL = 2
286290
TOKEN_SPACE = 3
@@ -346,6 +350,7 @@ def viml_type(obj):
346350
TOKEN_DOTDOTDOT = 63
347351
TOKEN_SHARP = 64
348352
TOKEN_ARROW = 65
353+
TOKEN_BLOB = 66
349354
MAX_FUNC_ARGS = 20
350355
def isalpha(c):
351356
return viml_eqregh(c, "^[A-Za-z]$")
@@ -1860,6 +1865,10 @@ def get2(self):
18601865
s = r.getn(3)
18611866
s += r.read_bdigit()
18621867
return self.token(TOKEN_NUMBER, s, pos)
1868+
elif c == "0" and (r.p(1) == "Z" or r.p(1) == "z") and r.p(2) != ".":
1869+
s = r.getn(2)
1870+
s += r.read_blob()
1871+
return self.token(TOKEN_BLOB, s, pos)
18631872
elif isdigit(c):
18641873
s = r.read_digit()
18651874
if r.p(0) == "." and isdigit(r.p(1)):
@@ -2583,6 +2592,10 @@ def parse_expr9(self):
25832592
node = Node(NODE_NUMBER)
25842593
node.pos = token.pos
25852594
node.value = token.value
2595+
elif token.type == TOKEN_BLOB:
2596+
node = Node(NODE_BLOB)
2597+
node.pos = token.pos
2598+
node.value = token.value
25862599
elif token.type == TOKEN_DQUOTE:
25872600
self.reader.seek_set(pos)
25882601
node = Node(NODE_STRING)
@@ -3057,6 +3070,20 @@ def read_odigit(self):
30573070
r += self.getn(1)
30583071
return r
30593072

3073+
def read_blob(self):
3074+
r = ""
3075+
while 1:
3076+
s = self.peekn(2)
3077+
if viml_eqregh(s, "^[0-9A-Fa-f][0-9A-Fa-f]$"):
3078+
r += self.getn(2)
3079+
elif viml_eqregh(s, "^\\.[0-9A-Fa-f]$"):
3080+
r += self.getn(1)
3081+
elif viml_eqregh(s, "^[0-9A-Fa-f][^0-9A-Fa-f]$"):
3082+
raise VimLParserException(Err("E973: Blob literal should have an even number of hex characters:" + s, self.getpos()))
3083+
else:
3084+
break
3085+
return r
3086+
30603087
def read_xdigit(self):
30613088
r = ""
30623089
while isxdigit(self.peekn(1)):
@@ -3297,6 +3324,8 @@ def compile(self, node):
32973324
return self.compile_call(node)
32983325
elif node.type == NODE_NUMBER:
32993326
return self.compile_number(node)
3327+
elif node.type == NODE_BLOB:
3328+
return self.compile_blob(node)
33003329
elif node.type == NODE_STRING:
33013330
return self.compile_string(node)
33023331
elif node.type == NODE_LIST:
@@ -3637,6 +3666,9 @@ def compile_call(self, node):
36373666
def compile_number(self, node):
36383667
return node.value
36393668

3669+
def compile_blob(self, node):
3670+
return node.value
3671+
36403672
def compile_string(self, node):
36413673
return node.value
36423674

test/test_blob.ok

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
(echo 0z)
2+
(echo 0z11)
3+
(echo 0zdeadbeef)
4+
(echo 0Zdeadbeef)
5+
(echo 0zDEADBEEF)
6+
(echo 0ZDEADBEEF)
7+
(echo 0ZDEAD.BEEF)
8+
(echo (+ 0z00 0zFF))

test/test_blob.vim

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
echo 0z
2+
echo 0z11
3+
echo 0zdeadbeef
4+
echo 0Zdeadbeef
5+
echo 0zDEADBEEF
6+
echo 0ZDEADBEEF
7+
echo 0ZDEAD.BEEF
8+
echo 0z00 + 0zFF

test/test_err_blob.ok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
vimlparser: E973: Blob literal should have an even number of hex characters:0X: line 2 col 8

test/test_err_blob.vim

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
echo 0z0
2+
echo 0z0X
3+
echo 0zAABBC
4+
echo 0zAAB.BCC

0 commit comments

Comments
 (0)