From e052226cdb77b295ae949e0a76e5f198f435221b Mon Sep 17 00:00:00 2001 From: 0264408 Date: Tue, 16 Jun 2026 10:11:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84main=E5=87=BD?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E6=B7=BB=E5=8A=A0run=5Ffile=E5=92=8Crun=5Fre?= =?UTF-8?q?pl=E5=87=BD=E6=95=B0=E4=BB=A5=E6=94=AF=E6=8C=81=E4=BB=8E?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=92=8CREPL=E8=AF=BB=E5=8F=96=E8=BE=93?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 105 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 73 insertions(+), 32 deletions(-) diff --git a/src/main.rs b/src/main.rs index 95fb4b7..554b434 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,45 +9,86 @@ use parser::Parser; use interpreter::Interpreter; use std::env; use std::fs; -use std::io::{self, Read}; - -fn main() { - let src = match env::args().len() { - 1 => { - // 无参数:从 stdin 读取 - let mut buf = String::new(); - if let Err(e) = io::stdin().read_to_string(&mut buf) { - eprintln!("Failed to read stdin: {}", e); - std::process::exit(1); - } - buf - } - 2 => { - // 一个参数:作为文件路径 - let path = env::args().nth(1).unwrap(); - match fs::read_to_string(&path) { - Ok(s) => s, - Err(e) => { - eprintln!("Failed to read file '{}': {}", path, e); - std::process::exit(1); - } - } - } - _ => { - eprintln!("Usage: aster [script_file]"); - eprintln!(" aster - run from stdin"); - eprintln!(" aster - run script file"); - std::process::exit(1); - } - }; +use std::io::Write; +use std::io::stdin; +use std::io::stdout; +fn run_file(src: String) { let tokens = Lexer::new(&src).tokenize(); let mut parser = Parser::new(tokens); let stmts = parser.parse(); let mut interpreter = Interpreter::new(); if let Err(e) = interpreter.interpret(stmts) { - eprintln!("{}", e); + eprintln!("Error: {}", e); std::process::exit(1); } } + +fn run_repl() { + println!("Welcome to Aster REPL!"); + println!("Type ':exit' to quit."); + println!("Type ':reset' to reset the interpreter state."); + + let mut interpreter = Interpreter::new(); + let mut line = String::new(); + + loop { + print!(">>> "); + stdout().flush().unwrap(); + + line.clear(); + if let Err(e) = stdin().read_line(&mut line) { + eprintln!("Error reading input: {}", e); + continue; + } + + let line = line.trim(); + if line.is_empty() { + continue; + } + + match line { + ":exit" => { + println!("Goodbye!"); + break; + } + ":reset" => { + interpreter = Interpreter::new(); + println!("Interpreter reset."); + continue; + } + _ => {} + } + + let tokens = Lexer::new(line).tokenize(); + let mut parser = Parser::new(tokens); + let stmts = parser.parse(); + + if let Err(e) = interpreter.interpret(stmts) { + eprintln!("Error: {}", e); + } + } +} + +fn main() { + let args: Vec = env::args().collect(); + + match args.len() { + 1 => run_repl(), + 2 => { + let filename = &args[1]; + match fs::read_to_string(filename) { + Ok(src) => run_file(src), + Err(e) => { + eprintln!("Error reading file '{}': {}", filename, e); + std::process::exit(1); + } + } + } + _ => { + eprintln!("Usage: aster [script]"); + std::process::exit(1); + } + } +}