From 3e4f9d7fa19341675380cb9c915d0527a518325b Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Mon, 3 Mar 2025 19:34:43 +0200 Subject: [PATCH] examples: cleanup and shorten mini_calculator_recursive_descent.v to 98 lines (#23847) --- examples/mini_calculator_recursive_descent.v | 40 +++++++++----------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/examples/mini_calculator_recursive_descent.v b/examples/mini_calculator_recursive_descent.v index 04525a5321..ff1a1d40f9 100644 --- a/examples/mini_calculator_recursive_descent.v +++ b/examples/mini_calculator_recursive_descent.v @@ -14,17 +14,17 @@ struct Parser { textscanner.TextScanner } -fn (mut p Parser) parse_expression() !f64 { - mut result := p.parse_term()! +fn (mut p Parser) expr() !f64 { + mut result := p.term()! for { p.skip_whitespace() c := p.peek_u8() if c == `+` { p.next() - result += p.parse_term()! + result += p.term()! } else if c == `-` { p.next() - result -= p.parse_term()! + result -= p.term()! } else { break } @@ -32,17 +32,17 @@ fn (mut p Parser) parse_expression() !f64 { return result } -fn (mut p Parser) parse_term() !f64 { - mut result := p.parse_factor()! +fn (mut p Parser) term() !f64 { + mut result := p.factor()! for { p.skip_whitespace() c := p.peek_u8() if c == `*` { p.next() - result *= p.parse_factor()! + result *= p.factor()! } else if c == `/` { p.next() - result /= p.parse_factor()! + result /= p.factor()! } else { break } @@ -50,14 +50,14 @@ fn (mut p Parser) parse_term() !f64 { return result } -fn (mut p Parser) parse_factor() !f64 { +fn (mut p Parser) factor() !f64 { p.skip_whitespace() c := p.peek_u8() if c.is_digit() { - return p.parse_number() + return p.number() } else if c == `(` { p.next() - result := p.parse_expression()! + result := p.expr()! p.skip_whitespace() if p.next() != `)` { return error('Expected closing parenthesis') @@ -67,7 +67,7 @@ fn (mut p Parser) parse_factor() !f64 { return error('Expected number or opening parenthesis') } -fn (mut p Parser) parse_number() !f64 { +fn (mut p Parser) number() !f64 { start := p.pos for { c := p.peek_u8() @@ -77,24 +77,20 @@ fn (mut p Parser) parse_number() !f64 { } break } - num_str := p.input[start..p.pos] - return strconv.atof64(num_str) or { return error('Invalid number') } + return strconv.atof64(p.input[start..p.pos]) or { error('Invalid number') } } -println('Please enter the expression you want to calculate, e.g. `2 * (5-1)` .') -println("Enter 'exit' or 'EXIT' to quit.") -mut expr_count := 0 -for { - expr_count++ - input := os.input_opt('[${expr_count}] ') or { +println('Enter expressions to calculate, e.g. `2 * (5-1)` or `exit` to quit.') +for i := 1; true; i++ { + input := os.input_opt('[${i}] ') or { println('') break }.trim_space() - if input in ['exit', 'EXIT'] { + if input.to_upper() == 'EXIT' { break } mut parser := Parser{textscanner.new(input)} - result := parser.parse_expression() or { + result := parser.expr() or { println('Error: ${err}') continue }