39 lines
1011 B
Rust
39 lines
1011 B
Rust
use common::logging::log;
|
|
|
|
use crate::model::{CompilerError, Program};
|
|
use parser::{ParseResult, Parser};
|
|
use semantic_analyser::Analyser;
|
|
|
|
pub mod lexer;
|
|
pub mod parser;
|
|
pub mod semantic_analyser;
|
|
|
|
pub fn generate_ast(input: &str) -> Result<Program, CompilerError> {
|
|
log("Tokenising Input...");
|
|
|
|
let lexer = lexer::Lexer::new(&input);
|
|
let tokens = lexer.collect::<Vec<_>>();
|
|
// println!("{tokens:?}");
|
|
|
|
log(&format!("Parsing {} Tokens...", tokens.len()));
|
|
|
|
let mut parser = Parser::new(tokens);
|
|
let ast = match parser.parse() {
|
|
ParseResult::Accept(ast) => ast,
|
|
ParseResult::Reject(e) => return Err(e),
|
|
ParseResult::Deny => {
|
|
return Err(CompilerError::Generic("Parser used ::Deny".to_string()));
|
|
}
|
|
};
|
|
// println!("{ast:#?}");
|
|
|
|
log("Analyzing AST...");
|
|
log("Checking Type Information...");
|
|
|
|
let analyser = Analyser::new();
|
|
analyser.analyse(ast.clone()).unwrap();
|
|
|
|
log("Type Checking Complete...");
|
|
Ok(ast)
|
|
}
|