def parse_number
self.lex_state = :expr_end
case
when src.scan(/[+-]?0[xbd]\b/) then
rb_compile_error "Invalid numeric format"
when src.scan(/[+-]?0x[a-f0-9_]+/i) then
int_with_base(16)
when src.scan(/[+-]?0b[01_]+/) then
int_with_base(2)
when src.scan(/[+-]?0d[0-9_]+/) then
int_with_base(10)
when src.scan(/[+-]?0[Oo]?[0-7_]*[89]/) then
rb_compile_error "Illegal octal digit."
when src.scan(/[+-]?0[Oo]?[0-7_]+|0[Oo]/) then
int_with_base(8)
when src.scan(/[+-]?[\d_]+_(e|\.)/) then
rb_compile_error "Trailing '_' in number."
when src.scan(/[+-]?[\d_]+\.[\d_]+(e[+-]?[\d_]+)?\b|[+-]?[\d_]+e[+-]?[\d_]+\b/i) then
number = src.matched
if number =~ /__/ then
rb_compile_error "Invalid numeric format"
end
self.yacc_value = number.to_f
:tFLOAT
when src.scan(/[+-]?0\b/) then
int_with_base(10)
when src.scan(/[+-]?[\d_]+\b/) then
int_with_base(10)
else
rb_compile_error "Bad number format"
end
end