aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorCody <cody@codyq.dev>2023-02-27 07:21:50 -0600
committerCody <cody@codyq.dev>2023-02-27 07:21:50 -0600
commitebfd74ddf0ef6372624ea171e06f8460d0e1351b (patch)
treed59df0e9600a6f2b86b57949048cf990a3e102ae /src/main.rs
parenta653a6602fe5ae5eb4739755db7b34bc92ecdadf (diff)
downloadsloth-ebfd74ddf0ef6372624ea171e06f8460d0e1351b.tar.gz
pain
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs55
1 files changed, 36 insertions, 19 deletions
diff --git a/src/main.rs b/src/main.rs
index f064d39..4a78e9e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,41 +6,58 @@
clippy::manual_ok_or,
unused_lifetimes
)]
+#![allow(unused)]
pub mod ast;
+pub mod interpreter;
pub mod lexer;
-use ast::{Expression, Operation, Value};
-use lexer::Lexer;
+use itertools::Itertools;
-use crate::ast::Statement;
+use crate::ast::parser::AstParser;
+use crate::ast::AstVisitor;
+use crate::interpreter::AstInterpreter;
+use crate::lexer::Lexer;
const SOURCE: &str = r#"
-val variable = 5;
+val variable = 5 + 6 * 2;
-if variable <= 7 {
+if variable == 17 {
print "Hello World";
}
-"#;
+fn fib(n: i32) -> i32 {
+ if n == 0 || n == 1 {
+ return n;
+ }
-fn main() {
- let lexer = Lexer::new(SOURCE);
- for token in lexer {
- print!("{} ", token.lexeme);
+ var grandparent = 0;
+ var parent = 1;
+ var me = 0;
+
+ for i in 0..n-1 {
+ me = parent + grandparent;
+ grandparent = parent;
+ parent = me;
}
- println!("-------");
+ return me;
+}
- let a = Expression::Literal(Value(7));
- let b = Expression::Binary {
- operation: Operation::Add,
- lhs: &Expression::Literal(Value(5)),
- rhs: &a,
- };
+print fib(5);
+
+"#;
+
+fn main() {
+ let lexer = Lexer::new("for x in 0..5 {}");
+ let tokens = lexer.collect_vec();
+ let mut parser = AstParser::new(tokens);
+ let ast = parser.parse();
- let stmt = Statement::Expression { expr: &b };
+ println!("{ast:#?}");
+ println!("--- Program Output ---");
- println!("{stmt}");
+ let mut interpreter = AstInterpreter::default();
+ interpreter.interpret(&ast);
}