aether-azathoth 0.5.3

A lightweight, embeddable domain-specific language (DSL) interpreter with rich standard library
Documentation
use crate::cli::error_context;
use std::fs;

pub fn check_file(filename: &str) {
    match fs::read_to_string(filename) {
        Ok(code) => {
            use aether::{Lexer, Parser};

            println!("正在检查 '{}'...", filename);

            let mut lexer = Lexer::new(&code);
            let mut token_count = 0;
            loop {
                let token = lexer.next_token();
                token_count += 1;
                if token == aether::Token::EOF {
                    break;
                }
                if let aether::Token::Illegal(ch) = token {
                    eprintln!(
                        "✗ 词法错误: 非法字符 '{}' 在行 {}, 列 {}",
                        ch,
                        lexer.line(),
                        lexer.column()
                    );
                    std::process::exit(1);
                }
            }

            let mut parser = Parser::new(&code);
            match parser.parse_program() {
                Ok(program) => {
                    println!("✓ 语法检查通过");
                    println!("  - {} 个词法单元", token_count);
                    println!("  - {} 条语句", program.len());
                    println!();
                }
                Err(e) => {
                    eprintln!("✗ 语法错误:");
                    error_context::print_detailed_error(&code, &e.to_string());
                    std::process::exit(1);
                }
            }
        }
        Err(e) => {
            eprintln!("✗ 无法读取文件 '{}': {}", filename, e);
            std::process::exit(1);
        }
    }
}

pub fn show_ast_for_file(filename: &str) {
    match fs::read_to_string(filename) {
        Ok(code) => {
            use aether::Parser;

            let mut parser = Parser::new(&code);
            match parser.parse_program() {
                Ok(program) => {
                    println!("=== 抽象语法树 (AST) ===");
                    println!("文件: {}", filename);
                    println!();
                    println!("{:#?}", program);
                    println!();
                    println!("=== 共 {} 条语句 ===", program.len());
                }
                Err(e) => {
                    eprintln!("✗ 解析错误:");
                    error_context::print_detailed_error(&code, &e.to_string());
                    std::process::exit(1);
                }
            }
        }
        Err(e) => {
            eprintln!("✗ 无法读取文件 '{}': {}", filename, e);
            std::process::exit(1);
        }
    }
}