60 lines
1.5 KiB
Rust
60 lines
1.5 KiB
Rust
use super::ast::*;
|
|
use crate::lex::tok::*;
|
|
use logos::Lexer;
|
|
use std::rc::Rc;
|
|
|
|
#[macro_export]
|
|
macro_rules! unwrap {
|
|
($var:expr) => {
|
|
$var.next().unwrap().unwrap()
|
|
}
|
|
}
|
|
|
|
pub fn parse_math(mut tokens: Lexer<Token>) -> Option<Expr> {
|
|
// Is it a Value? → Is it an operator? → Is it a value?
|
|
|
|
if let Some(Ok(Number(left))) = tokens.next() {
|
|
if let Some(op) = match_operator(&mut tokens) {
|
|
if let Some(right) = parse_math(tokens) {
|
|
return Some(Expr::MathExpr(Math {left: Rc::new(Expr::Number(left)), right: Rc::new(right), operator: op}));
|
|
}
|
|
} else {
|
|
return Some(Expr::Number(left));
|
|
}
|
|
}
|
|
None
|
|
}
|
|
|
|
pub fn parse_global_declaration(mut tokens: Lexer<Token>) -> Option<Expr> {
|
|
let mut tok = None;
|
|
if unwrap!(tokens) == Let {
|
|
if unwrap!(tokens) == Identifier {
|
|
let name = tokens.slice();
|
|
|
|
println!("{:?}", name);
|
|
if unwrap!(tokens) == Equal {
|
|
let temp_token = unwrap!(tokens);
|
|
if let Number(n) = temp_token {
|
|
tok = Some(Expr::GlobalDefinition(Rc::new(VarDefinition {name, value: n})));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
tok
|
|
}
|
|
|
|
pub fn match_operator(tokens: &mut Lexer<Token>) -> Option<MathOperator> {
|
|
if let Some(Ok(token)) = tokens.next() {
|
|
return match token {
|
|
Plus => Some(MathOperator::OP_ADD),
|
|
Minus => Some(MathOperator::OP_SUB),
|
|
Slash => Some(MathOperator::OP_DIV),
|
|
Star => Some(MathOperator::OP_MULT),
|
|
Percent => Some(MathOperator::OP_MOD),
|
|
_ => None
|
|
};
|
|
}
|
|
|
|
None
|
|
}
|