Add support for octal and binary int literals.

Simplify support for alternate bases using int(..., base=0) which
auto-detects it using the standard Python syntax for numbers.

Octal numbers are useful to specify permission bits and umasks.

Binary numbers are not super useful... But considering we get them for
free, let's allow them here too.

v2: Tweak the regex so it doesn't accept a decimal number with a leading
zero, which is invalid for int(..., base=0) and would raise a ValueError
if passed around.
pull/3476/head
Filipe Brandenburger 7 years ago
parent ecbeae565b
commit 86d2f57e86
  1. 8
      mesonbuild/mparser.py
  2. 12
      test cases/common/68 number arithmetic/meson.build

@ -94,8 +94,7 @@ class Lexer:
# Need to be sorted longest to shortest.
('ignore', re.compile(r'[ \t]')),
('id', re.compile('[_a-zA-Z][_0-9a-zA-Z]*')),
('hexnumber', re.compile('0[xX][0-9a-fA-F]+')),
('number', re.compile(r'\d+')),
('number', re.compile(r'0[bB][01]+|0[oO][0-7]+|0[xX][0-9a-fA-F]+|0|[1-9]\d*')),
('eol_cont', re.compile(r'\\\n')),
('eol', re.compile(r'\n')),
('multiline_string', re.compile(r"'''(.|\n)*?'''", re.M)),
@ -187,10 +186,7 @@ This will become a hard error in a future Meson release.""", self.getline(line_s
lineno += len(lines) - 1
line_start = mo.end() - len(lines[-1])
elif tid == 'number':
value = int(match_text)
elif tid == 'hexnumber':
tid = 'number'
value = int(match_text, base=16)
value = int(match_text, base=0)
elif tid == 'eol' or tid == 'eol_cont':
lineno += 1
line_start = loc

@ -62,3 +62,15 @@ hex2_255 = 0XFF
assert(hex_255 == 255, 'Hex parsing is broken.')
assert(hex2_255 == 255, 'Uppercase hex parsing is broken.')
bin_123 = 0b1111011
bin2_123 = 0B1111011
assert(bin_123 == 123, 'Bin number parsing is broken.')
assert(bin2_123 == 123, 'Uppercase bin number parsing is broken.')
oct_493 = 0o755
oct2_493 = 0O755
assert(oct_493 == 493, 'Oct number parsing is broken.')
assert(oct2_493 == 493, 'Uppercase oct number parsing is broken.')

Loading…
Cancel
Save