skylang/src/parse/parse.rs

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
}