mirror of
https://github.com/vlang/v.git
synced 2025-09-13 14:32:26 +03:00
examples: cleanup and shorten mini_calculator_recursive_descent.v to 98 lines (#23847)
This commit is contained in:
parent
2641a55a63
commit
3e4f9d7fa1
1 changed files with 18 additions and 22 deletions
|
@ -14,17 +14,17 @@ struct Parser {
|
||||||
textscanner.TextScanner
|
textscanner.TextScanner
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut p Parser) parse_expression() !f64 {
|
fn (mut p Parser) expr() !f64 {
|
||||||
mut result := p.parse_term()!
|
mut result := p.term()!
|
||||||
for {
|
for {
|
||||||
p.skip_whitespace()
|
p.skip_whitespace()
|
||||||
c := p.peek_u8()
|
c := p.peek_u8()
|
||||||
if c == `+` {
|
if c == `+` {
|
||||||
p.next()
|
p.next()
|
||||||
result += p.parse_term()!
|
result += p.term()!
|
||||||
} else if c == `-` {
|
} else if c == `-` {
|
||||||
p.next()
|
p.next()
|
||||||
result -= p.parse_term()!
|
result -= p.term()!
|
||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -32,17 +32,17 @@ fn (mut p Parser) parse_expression() !f64 {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut p Parser) parse_term() !f64 {
|
fn (mut p Parser) term() !f64 {
|
||||||
mut result := p.parse_factor()!
|
mut result := p.factor()!
|
||||||
for {
|
for {
|
||||||
p.skip_whitespace()
|
p.skip_whitespace()
|
||||||
c := p.peek_u8()
|
c := p.peek_u8()
|
||||||
if c == `*` {
|
if c == `*` {
|
||||||
p.next()
|
p.next()
|
||||||
result *= p.parse_factor()!
|
result *= p.factor()!
|
||||||
} else if c == `/` {
|
} else if c == `/` {
|
||||||
p.next()
|
p.next()
|
||||||
result /= p.parse_factor()!
|
result /= p.factor()!
|
||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -50,14 +50,14 @@ fn (mut p Parser) parse_term() !f64 {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut p Parser) parse_factor() !f64 {
|
fn (mut p Parser) factor() !f64 {
|
||||||
p.skip_whitespace()
|
p.skip_whitespace()
|
||||||
c := p.peek_u8()
|
c := p.peek_u8()
|
||||||
if c.is_digit() {
|
if c.is_digit() {
|
||||||
return p.parse_number()
|
return p.number()
|
||||||
} else if c == `(` {
|
} else if c == `(` {
|
||||||
p.next()
|
p.next()
|
||||||
result := p.parse_expression()!
|
result := p.expr()!
|
||||||
p.skip_whitespace()
|
p.skip_whitespace()
|
||||||
if p.next() != `)` {
|
if p.next() != `)` {
|
||||||
return error('Expected closing parenthesis')
|
return error('Expected closing parenthesis')
|
||||||
|
@ -67,7 +67,7 @@ fn (mut p Parser) parse_factor() !f64 {
|
||||||
return error('Expected number or opening parenthesis')
|
return error('Expected number or opening parenthesis')
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut p Parser) parse_number() !f64 {
|
fn (mut p Parser) number() !f64 {
|
||||||
start := p.pos
|
start := p.pos
|
||||||
for {
|
for {
|
||||||
c := p.peek_u8()
|
c := p.peek_u8()
|
||||||
|
@ -77,24 +77,20 @@ fn (mut p Parser) parse_number() !f64 {
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
num_str := p.input[start..p.pos]
|
return strconv.atof64(p.input[start..p.pos]) or { error('Invalid number') }
|
||||||
return strconv.atof64(num_str) or { return error('Invalid number') }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
println('Please enter the expression you want to calculate, e.g. `2 * (5-1)` .')
|
println('Enter expressions to calculate, e.g. `2 * (5-1)` or `exit` to quit.')
|
||||||
println("Enter 'exit' or 'EXIT' to quit.")
|
for i := 1; true; i++ {
|
||||||
mut expr_count := 0
|
input := os.input_opt('[${i}] ') or {
|
||||||
for {
|
|
||||||
expr_count++
|
|
||||||
input := os.input_opt('[${expr_count}] ') or {
|
|
||||||
println('')
|
println('')
|
||||||
break
|
break
|
||||||
}.trim_space()
|
}.trim_space()
|
||||||
if input in ['exit', 'EXIT'] {
|
if input.to_upper() == 'EXIT' {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
mut parser := Parser{textscanner.new(input)}
|
mut parser := Parser{textscanner.new(input)}
|
||||||
result := parser.parse_expression() or {
|
result := parser.expr() or {
|
||||||
println('Error: ${err}')
|
println('Error: ${err}')
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue