Skip to content

Commit 1a1cc96

Browse files
authored
Merge pull request #89 from vim-jp/support-bin-number
Support binary number literals (e.g. 0b0, 0b1011)
2 parents e407a31 + f47b0e6 commit 1a1cc96

File tree

5 files changed

+47
-0
lines changed

5 files changed

+47
-0
lines changed

autoload/vimlparser.vim

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2576,6 +2576,10 @@ function! s:ExprTokenizer.get2()
25762576
let s = r.getn(3)
25772577
let s .= r.read_xdigit()
25782578
return self.token(s:TOKEN_NUMBER, s, pos)
2579+
elseif c ==# '0' && (r.p(1) ==# 'B' || r.p(1) ==# 'b') && (r.p(2) == '0' || r.p(2) == '1')
2580+
let s = r.getn(3)
2581+
let s .= r.read_bdigit()
2582+
return self.token(s:TOKEN_NUMBER, s, pos)
25792583
elseif s:isdigit(c)
25802584
let s = r.read_digit()
25812585
if r.p(0) ==# '.' && s:isdigit(r.p(1))
@@ -3945,6 +3949,14 @@ function! s:StringReader.read_xdigit()
39453949
return r
39463950
endfunction
39473951

3952+
function! s:StringReader.read_bdigit()
3953+
let r = ''
3954+
while self.peekn(1) == '0' || self.peekn(1) == '1'
3955+
let r .= self.getn(1)
3956+
endwhile
3957+
return r
3958+
endfunction
3959+
39483960
function! s:StringReader.read_integer()
39493961
let r = ''
39503962
let c = self.peekn(1)

js/vimlparser.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2324,6 +2324,11 @@ ExprTokenizer.prototype.get2 = function() {
23242324
s += r.read_xdigit();
23252325
return this.token(TOKEN_NUMBER, s, pos);
23262326
}
2327+
else if (c == "0" && (r.p(1) == "B" || r.p(1) == "b") && (r.p(2) == "0" || r.p(2) == "1")) {
2328+
var s = r.getn(3);
2329+
s += r.read_bdigit();
2330+
return this.token(TOKEN_NUMBER, s, pos);
2331+
}
23272332
else if (isdigit(c)) {
23282333
var s = r.read_digit();
23292334
if (r.p(0) == "." && isdigit(r.p(1))) {
@@ -3849,6 +3854,14 @@ StringReader.prototype.read_xdigit = function() {
38493854
return r;
38503855
}
38513856

3857+
StringReader.prototype.read_bdigit = function() {
3858+
var r = "";
3859+
while (this.peekn(1) == "0" || this.peekn(1) == "1") {
3860+
r += this.getn(1);
3861+
}
3862+
return r;
3863+
}
3864+
38523865
StringReader.prototype.read_integer = function() {
38533866
var r = "";
38543867
var c = this.peekn(1);

py/vimlparser.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1856,6 +1856,10 @@ def get2(self):
18561856
s = r.getn(3)
18571857
s += r.read_xdigit()
18581858
return self.token(TOKEN_NUMBER, s, pos)
1859+
elif c == "0" and (r.p(1) == "B" or r.p(1) == "b") and (r.p(2) == "0" or r.p(2) == "1"):
1860+
s = r.getn(3)
1861+
s += r.read_bdigit()
1862+
return self.token(TOKEN_NUMBER, s, pos)
18591863
elif isdigit(c):
18601864
s = r.read_digit()
18611865
if r.p(0) == "." and isdigit(r.p(1)):
@@ -3059,6 +3063,12 @@ def read_xdigit(self):
30593063
r += self.getn(1)
30603064
return r
30613065

3066+
def read_bdigit(self):
3067+
r = ""
3068+
while self.peekn(1) == "0" or self.peekn(1) == "1":
3069+
r += self.getn(1)
3070+
return r
3071+
30623072
def read_integer(self):
30633073
r = ""
30643074
c = self.peekn(1)

test/test_number.ok

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@
22
(echo 1.0)
33
(echo 1.23)
44
(echo 0xdeadbeef)
5+
(echo 0Xdeadbeef)
56
(echo 033)
67
(echo 1.2e-3)
78
(echo 4.5E+67)
89
(echo 4.5e8)
10+
(echo 0b1011)
11+
(echo 0b0)
12+
(echo 0B1011)
13+
(echo 0B0)
14+
(echo 0b01 23)

test/test_number.vim

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ echo 1
22
echo 1.0
33
echo 1.23
44
echo 0xdeadbeef
5+
echo 0Xdeadbeef
56
echo 033
67
echo 1.2e-3
78
echo 4.5E+67
89
echo 4.5e8
10+
echo 0b1011
11+
echo 0b0
12+
echo 0B1011
13+
echo 0B0
14+
echo 0b0123

0 commit comments

Comments
 (0)