scanner: refactor ident_dec_number
parent
86df486988
commit
b0e498bf0b
|
@ -213,7 +213,6 @@ fn (s mut Scanner) ident_oct_number() string {
|
||||||
fn (s mut Scanner) ident_dec_number() string {
|
fn (s mut Scanner) ident_dec_number() string {
|
||||||
mut has_wrong_digit := false
|
mut has_wrong_digit := false
|
||||||
mut first_wrong_digit := `\0`
|
mut first_wrong_digit := `\0`
|
||||||
mut call_method := false // true for, e.g., 12.str(), 12.3.str(), 12e-3.str()
|
|
||||||
start_pos := s.pos
|
start_pos := s.pos
|
||||||
// scan integer part
|
// scan integer part
|
||||||
for s.pos < s.text.len {
|
for s.pos < s.text.len {
|
||||||
|
@ -229,23 +228,21 @@ fn (s mut Scanner) ident_dec_number() string {
|
||||||
}
|
}
|
||||||
s.pos++
|
s.pos++
|
||||||
}
|
}
|
||||||
// e.g. 1..9
|
mut call_method := false // true for, e.g., 5.str(), 5.5.str(), 5e5.str()
|
||||||
// we just return '1' and don't scan '..9'
|
mut is_range := false // true for, e.g., 5..10
|
||||||
if s.expect('..', s.pos) {
|
mut is_float_without_fraction := false // true for, e.g. 5.
|
||||||
number := filter_num_sep(s.text.str, start_pos, s.pos)
|
|
||||||
s.pos--
|
|
||||||
return number
|
|
||||||
}
|
|
||||||
// scan fractional part
|
// scan fractional part
|
||||||
if s.pos < s.text.len && s.text[s.pos] == `.` {
|
if s.pos < s.text.len && s.text[s.pos] == `.` {
|
||||||
s.pos++
|
s.pos++
|
||||||
if s.pos < s.text.len {
|
if s.pos < s.text.len {
|
||||||
|
// 5.5, 5.5.str()
|
||||||
if s.text[s.pos].is_digit() {
|
if s.text[s.pos].is_digit() {
|
||||||
for s.pos < s.text.len {
|
for s.pos < s.text.len {
|
||||||
c := s.text[s.pos]
|
c := s.text[s.pos]
|
||||||
if !c.is_digit() {
|
if !c.is_digit() {
|
||||||
if !c.is_letter() || c in [`e`, `E`] || s.is_inside_string {
|
if !c.is_letter() || c in [`e`, `E`] || s.is_inside_string {
|
||||||
if c == `.` && s.pos + 1 < s.text.len && !s.text[s.pos + 1].is_digit() && s.text[s.pos + 1] != `)` {
|
// 5.5.str()
|
||||||
|
if c == `.` && s.pos + 1 < s.text.len && s.text[s.pos + 1].is_letter() {
|
||||||
call_method = true
|
call_method = true
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
@ -258,17 +255,30 @@ fn (s mut Scanner) ident_dec_number() string {
|
||||||
s.pos++
|
s.pos++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if !(s.text[s.pos] in [`)`, `e`, `E`]) {
|
// 5.. (a range)
|
||||||
|
else if s.text[s.pos] == `.` {
|
||||||
|
is_range = true
|
||||||
|
s.pos--
|
||||||
|
}
|
||||||
|
// 5.e5
|
||||||
|
else if s.text[s.pos] in [`e`, `E`] { }
|
||||||
|
// 5.str()
|
||||||
|
else if s.text[s.pos].is_letter() {
|
||||||
call_method = true
|
call_method = true
|
||||||
s.pos--
|
s.pos--
|
||||||
}
|
}
|
||||||
|
// 5.
|
||||||
|
else if s.text[s.pos] != `)` {
|
||||||
|
is_float_without_fraction = true
|
||||||
|
s.pos--
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// scan exponential part
|
// scan exponential part
|
||||||
mut has_exponential_part := false
|
mut has_exp := false
|
||||||
if s.expect('e', s.pos) || s.expect('E', s.pos) {
|
if s.pos < s.text.len && s.text[s.pos] in [`e`, `E`] {
|
||||||
|
has_exp = true
|
||||||
s.pos++
|
s.pos++
|
||||||
exp_start_pos := s.pos
|
|
||||||
if s.pos < s.text.len && s.text[s.pos] in [`-`, `+`] {
|
if s.pos < s.text.len && s.text[s.pos] in [`-`, `+`] {
|
||||||
s.pos++
|
s.pos++
|
||||||
}
|
}
|
||||||
|
@ -276,7 +286,8 @@ fn (s mut Scanner) ident_dec_number() string {
|
||||||
c := s.text[s.pos]
|
c := s.text[s.pos]
|
||||||
if !c.is_digit() {
|
if !c.is_digit() {
|
||||||
if !c.is_letter() || s.is_inside_string {
|
if !c.is_letter() || s.is_inside_string {
|
||||||
if c == `.` && s.pos + 1 < s.text.len && !s.text[s.pos + 1].is_digit() && s.text[s.pos + 1] != `)` {
|
// 5e5.str()
|
||||||
|
if c == `.` && s.pos + 1 < s.text.len && s.text[s.pos + 1].is_letter() {
|
||||||
call_method = true
|
call_method = true
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
@ -288,23 +299,24 @@ fn (s mut Scanner) ident_dec_number() string {
|
||||||
}
|
}
|
||||||
s.pos++
|
s.pos++
|
||||||
}
|
}
|
||||||
if exp_start_pos == s.pos {
|
}
|
||||||
s.error('exponent has no digits')
|
// error check: wrong digit
|
||||||
}
|
if has_wrong_digit {
|
||||||
has_exponential_part = true
|
s.error('this number has unsuitable digit `${first_wrong_digit.str()}`')
|
||||||
|
}
|
||||||
|
// error check: 5e
|
||||||
|
else if s.text[s.pos - 1] in [`e`, `E`] {
|
||||||
|
s.error('exponent has no digits')
|
||||||
}
|
}
|
||||||
// error check: 1.23.4, 123.e+3.4
|
// error check: 1.23.4, 123.e+3.4
|
||||||
if s.pos < s.text.len && s.text[s.pos] == `.` && !call_method {
|
else if s.pos < s.text.len && s.text[s.pos] == `.` && !is_range && !is_float_without_fraction && !call_method {
|
||||||
if has_exponential_part {
|
if has_exp {
|
||||||
s.error('exponential part should be integer')
|
s.error('exponential part should be integer')
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
s.error('too many decimal points in number')
|
s.error('too many decimal points in number')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if has_wrong_digit {
|
|
||||||
s.error('this number has unsuitable digit `${first_wrong_digit.str()}`')
|
|
||||||
}
|
|
||||||
number := filter_num_sep(s.text.str, start_pos, s.pos)
|
number := filter_num_sep(s.text.str, start_pos, s.pos)
|
||||||
s.pos--
|
s.pos--
|
||||||
return number
|
return number
|
||||||
|
|
Loading…
Reference in New Issue