examples: cleanup and shorten mini_calculator_recursive_descent.v to 98 lines (#23847)

This commit is contained in:
Delyan Angelov 2025-03-03 19:34:43 +02:00 committed by GitHub
parent 2641a55a63
commit 3e4f9d7fa1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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
} }