aboutsummaryrefslogtreecommitdiff
path: root/sloth/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'sloth/src/main.rs')
-rw-r--r--sloth/src/main.rs25
1 files changed, 20 insertions, 5 deletions
diff --git a/sloth/src/main.rs b/sloth/src/main.rs
index a85a8d5..3a70197 100644
--- a/sloth/src/main.rs
+++ b/sloth/src/main.rs
@@ -1,3 +1,4 @@
+#![feature(let_chains)]
#![warn(
clippy::wildcard_imports,
clippy::string_add,
@@ -6,6 +7,7 @@
unused_lifetimes
)]
+pub mod analysis;
pub mod lexer;
pub mod parser;
pub mod sloth_std;
@@ -13,10 +15,11 @@ pub mod symtable;
use std::{env, fs};
+use analysis::analyze;
use itertools::Itertools;
use lexer::Lexer;
-use parser::graph::GraphBuilder;
use parser::AstParser;
+use symtable::{Symbol, SymbolTable, SymbolType};
fn main() {
let args = env::args().collect_vec();
@@ -29,13 +32,25 @@ fn main() {
let source_path = &args[1];
let Ok(source) = fs::read_to_string(source_path) else {
- println!("Error while reading '{source_path}'");
+ eprintln!("Error while reading '{source_path}'");
return;
};
+ // Symbol table
+ let mut global_symtable = SymbolTable::new();
+ global_symtable.insert("print".to_owned(), Symbol::new(SymbolType::Function));
+ global_symtable.insert("println".to_owned(), Symbol::new(SymbolType::Function));
+ global_symtable.insert("readln".to_owned(), Symbol::new(SymbolType::Function));
+
+ // Parsing
let tokens = Lexer::new(&source).collect_vec();
- let ast = AstParser::parse(tokens).unwrap();
+ let mut ast = AstParser::parse(tokens, global_symtable).unwrap();
+
+ if let Err(error) = analyze(&mut ast) {
+ eprintln!("Failed to compile code:");
+ eprintln!("{error}");
+ }
- let graph = GraphBuilder::generate(&ast).unwrap();
- println!("{graph}");
+ // let graph = GraphBuilder::generate(&ast).unwrap();
+ // println!("{graph}");
}