Skip to content

Commit

Permalink
new error managment, new debug capacities and misc improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
Xavier2p committed Sep 25, 2023
1 parent a5bb4b9 commit adc110c
Show file tree
Hide file tree
Showing 16 changed files with 355 additions and 386 deletions.
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "fortran-rs"
version = "0.1.0"
edition = "2021"
edition = "2021"
authors = ["Xavier2p <https://github.com/Xavier2p>"]
description = "An open-source Fortran interpreter.\nWritten in Rust."
license = "MIT"
Expand All @@ -16,4 +16,4 @@ documentation = "https://xavier2p.github.io/fortran.rs"
test-case = "3.1.0"
colored = "2.0.0"
# clap = { version = "3.2.25", features = ["derive"] }
clap = {version = "4.4.4", features = ["derive"] }
clap = { version = "4.4.4", features = ["derive"] }
187 changes: 7 additions & 180 deletions src/ast.rs
Original file line number Diff line number Diff line change
@@ -1,186 +1,13 @@
use crate::{
// errors::{Error, ErrorKind},
tokens::Token,
variables::Variable,
};
use crate::tokens::Token;

pub struct Node {
pub token: Token,
pub left: Box<Node>,
pub right: Box<Node>,
struct Node {
token: Token,
left: Option<Box<Node>>,
right: Option<Box<Node>>,
}

trait NodeTrait<T> {
fn new(token: Token, left: Box<Node>, right: Box<Node>) -> Node;
fn eval(&self) -> T;
}

impl NodeTrait<i32> for Node {
fn new(token: Token, left: Box<Node>, right: Box<Node>) -> Node {
Node { token, left, right }
}

fn eval(&self) -> i32 {
match self.token {
Token::Operator(_) => match self.token.get_value().as_str() {
"+" => {
let left = self.left.eval();
let right = self.right.eval();
left + right
}
"-" => {
let left = self.left.eval();
let right = self.right.eval();
left - right
}
"*" => {
let left = self.left.eval();
let right = self.right.eval();
left * right
}
"/" => {
let left = self.left.eval();
let right = self.right.eval();
left / right
}
_ => 0,
},
Token::Number(n) => n,
Token::Variable(v) => {
let var = Variable::new(v);
var.get_value() // parse value for i32
}
_ => 0,
}
}
}

impl NodeTrait<f64> for Node {
fn new(token: Token, left: Box<Node>, right: Box<Node>) -> Node {
Node { token, left, right }
}

fn eval(&self) -> f64 {
match self.token {
Token::Operator(_) => match self.token.get_value().as_str() {
"+" => {
let left = self.left.eval();
let right = self.right.eval();
left + right
}
"-" => {
let left = self.left.eval();
let right = self.right.eval();
left - right
}
"*" => {
let left = self.left.eval();
let right = self.right.eval();
left * right
}
"/" => {
let left = self.left.eval();
let right = self.right.eval();
left / right
}
_ => 0.0,
},
Token::Number(n) => n,
Token::Variable(v) => {
let var = Variable::new(v);
var.get_value() // parse value for f64
}
_ => 0.0,
}
}
}

impl NodeTrait<String> for Node {
fn new(token: Token, left: Box<Node>, right: Box<Node>) -> Node {
impl Node {
fn new(token: Token, left: Option<Box<Node>>, right: Option<Box<Node>>) -> Node {
Node { token, left, right }
}

fn eval(&self) -> String {
match self.token {
Token::Operator(_) => match self.token.get_value().as_str() {
"+" => {
let left: String = self.left.eval();
let right: String = self.right.eval();
left + &right
}
"-" => {
let left: String = self.left.eval();
let right: String = self.right.eval();
left - right
}
"*" => {
let left = self.left.eval();
let right = self.right.eval();
left * right
}
"/" => {
let left = self.left.eval();
let right = self.right.eval();
left / right
}
_ => "0".to_string(),
},
Token::Number(n) => n.to_string(),
Token::Variable(v) => {
let var = Variable::new(v);
var.get_value()
}
_ => "0".to_string(),
}
}
}

// impl Node {
// pub fn new(token: Token, left: Box<Node>, right: Box<Node>) -> Node {
// Node { token, left, right }
// }

// pub fn eval(&self) {
// match self.token {
// Token::Operator(_) => match self.token.get_value().as_str() {
// "+" => {
// let left = self.left.eval();
// let right = self.right.eval();
// left + right
// }
// "-" => {
// let left = self.left.eval();
// let right = self.right.eval();
// left - right
// }
// "*" => {
// let left = self.left.eval();
// let right = self.right.eval();
// left * right
// }
// "/" => {
// let left = self.left.eval();
// let right = self.right.eval();
// left / right
// }
// _ => {
// let error = Error::new(
// "test".to_string(),
// "module".to_string(),
// 0,
// 12,
// "Unknown operator".to_string(),
// ErrorKind::Syntax,
// );
// error.raise();
// }
// },
// Token::Number(n) => n,
// Token::Variable(v) => {
// let var = Variable::new(v);
// var.get_value()
// }
// _ => 0,
// }
// }
// }
1 change: 1 addition & 0 deletions src/builtins/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

119 changes: 0 additions & 119 deletions src/errors.rs

This file was deleted.

Loading

0 comments on commit adc110c

Please sign in to comment.