Skip to content

Commit

Permalink
Merge pull request #29 from Sreyas-Sreelal/0.3.2
Browse files Browse the repository at this point in the history
0.3.2
  • Loading branch information
Sreyas-Sreelal authored Apr 10, 2023
2 parents e3a2a97 + 0dac921 commit 687f66d
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 7 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "malluscript"
version = "0.3.1"
version = "0.3.2"
authors = ["SyS <[email protected]>"]
edition = "2018"
build = "build.rs"
Expand Down
2 changes: 1 addition & 1 deletion src/bin/malluscript.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use std::fs::File;
use std::io::prelude::*;

fn main() {
let matches = App::new("guhiki")
let matches = App::new("Malluscript")
.version(env!("CARGO_PKG_VERSION"))
.author(env!("CARGO_PKG_AUTHORS"))
.about(env!("CARGO_PKG_DESCRIPTION"))
Expand Down
58 changes: 53 additions & 5 deletions src/executor/datatype.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,44 @@
use crate::executor::error::{raise_error, RunTimeErrors};
use std::fmt;

macro_rules! safe_operation {
($l:ident + $r:ident) => {
if let Some(result) = $l.checked_add($r) {
result
} else {
raise_error(RunTimeErrors::IntegerOverFlow)
}
};
($l:ident - $r:ident) => {
if let Some(result) = $l.checked_sub($r) {
result
} else {
raise_error(RunTimeErrors::IntegerOverFlow)
}
};
($l:ident * $r:ident) => {
if let Some(result) = $l.checked_mul($r) {
result
} else {
raise_error(RunTimeErrors::IntegerOverFlow)
}
};
($l:ident / $r:ident) => {
if let Some(result) = $l.checked_div($r) {
result
} else {
raise_error(RunTimeErrors::IntegerOverFlow)
}
};
($l:ident % $r:ident) => {
if let Some(result) = $l.checked_rem($r) {
result
} else {
raise_error(RunTimeErrors::IntegerOverFlow)
}
};
}

#[derive(Debug, PartialEq, Clone, PartialOrd)]
pub enum DataTypes {
String(String),
Expand All @@ -25,7 +63,9 @@ impl std::ops::Add for DataTypes {
type Output = Self;
fn add(self, rhs: DataTypes) -> Self {
match (self, rhs) {
(DataTypes::Integer(l), DataTypes::Integer(r)) => DataTypes::Integer(l + r),
(DataTypes::Integer(l), DataTypes::Integer(r)) => {
DataTypes::Integer(safe_operation!(l + r))
}
(DataTypes::Float(l), DataTypes::Float(r)) => DataTypes::Float(l + r),
(DataTypes::Float(l), DataTypes::Integer(r)) => DataTypes::Float(l + r as f64),
(DataTypes::Integer(l), DataTypes::Float(r)) => DataTypes::Float(l as f64 + r),
Expand All @@ -49,7 +89,9 @@ impl std::ops::Sub for DataTypes {
type Output = Self;
fn sub(self, rhs: DataTypes) -> Self {
match (self, rhs) {
(DataTypes::Integer(l), DataTypes::Integer(r)) => DataTypes::Integer(l - r),
(DataTypes::Integer(l), DataTypes::Integer(r)) => {
DataTypes::Integer(safe_operation!(l - r))
}
(DataTypes::Float(l), DataTypes::Float(r)) => DataTypes::Float(l - r),
(DataTypes::Float(l), DataTypes::Integer(r)) => DataTypes::Float(l - r as f64),
(DataTypes::Integer(l), DataTypes::Float(r)) => DataTypes::Float(l as f64 - r),
Expand All @@ -62,7 +104,9 @@ impl std::ops::Mul for DataTypes {
type Output = Self;
fn mul(self, rhs: DataTypes) -> Self {
match (self, rhs) {
(DataTypes::Integer(l), DataTypes::Integer(r)) => DataTypes::Integer(l * r),
(DataTypes::Integer(l), DataTypes::Integer(r)) => {
DataTypes::Integer(safe_operation!(l * r))
}
(DataTypes::Float(l), DataTypes::Float(r)) => DataTypes::Float(l * r),
(DataTypes::Float(l), DataTypes::Integer(r)) => DataTypes::Float(l * r as f64),
(DataTypes::Integer(l), DataTypes::Float(r)) => DataTypes::Float(l as f64 * r),
Expand All @@ -78,7 +122,9 @@ impl std::ops::Div for DataTypes {
raise_error(RunTimeErrors::DivisionByZero);
}
match (self, rhs) {
(DataTypes::Integer(l), DataTypes::Integer(r)) => DataTypes::Integer(l / r),
(DataTypes::Integer(l), DataTypes::Integer(r)) => {
DataTypes::Integer(safe_operation!(l / r))
}
(DataTypes::Float(l), DataTypes::Float(r)) => DataTypes::Float(l / r),
(DataTypes::Float(l), DataTypes::Integer(r)) => DataTypes::Float(l / r as f64),
(DataTypes::Integer(l), DataTypes::Float(r)) => DataTypes::Float(l as f64 / r),
Expand All @@ -94,7 +140,9 @@ impl std::ops::Rem for DataTypes {
raise_error(RunTimeErrors::DivisionByZero);
}
match (self, rhs) {
(DataTypes::Integer(l), DataTypes::Integer(r)) => DataTypes::Integer(l % r),
(DataTypes::Integer(l), DataTypes::Integer(r)) => {
DataTypes::Integer(safe_operation!(l % r))
}
(DataTypes::Float(l), DataTypes::Float(r)) => DataTypes::Float(l % r),
(DataTypes::Float(l), DataTypes::Integer(r)) => DataTypes::Float(l % r as f64),
(DataTypes::Integer(l), DataTypes::Float(r)) => DataTypes::Float(l as f64 % r),
Expand Down
5 changes: 5 additions & 0 deletions src/executor/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ pub enum RunTimeErrors {
ErrorReadingStdin,
InvalidFunctionDeclaration,
ArgumentCountMismatch,
IntegerOverFlow,
}

impl fmt::Display for RunTimeErrors {
Expand Down Expand Up @@ -43,6 +44,10 @@ impl fmt::Display for RunTimeErrors {
f,
"[Error]: Argument number doesnot match paramteters number"
),
RunTimeErrors::IntegerOverFlow => write!(
f,
"[Error]: Integer OverFlow, attempt to arithmetic operation that leads to overflow"
),
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/executor/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ impl Executor {
}
match self.symbol_table.get(&(level, *address)) {
Some(DataTypes::Integer(number)) => Ok(DataTypes::Integer(*number)),
Some(DataTypes::Float(number)) => Ok(DataTypes::Float(*number)),
Some(DataTypes::String(data)) => Ok(DataTypes::String(data.to_string())),
_ => Err((
(*a, *b),
Expand Down Expand Up @@ -262,6 +263,8 @@ impl Executor {

if let Ok(data) = input.trim().parse() {
Ok(DataTypes::Integer(data))
} else if let Ok(data) = input.trim().parse() {
Ok(DataTypes::Float(data))
} else {
Err(((*a, *b), RunTimeErrors::InvalidNumberInput))
}
Expand Down
2 changes: 2 additions & 0 deletions src/lexer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ impl<'input> Lexer<'input> {
|| c == '>'
|| c == '='
|| c == ','
|| c == '{'
|| c == '}'
}

fn is_valid_name(&self, c: char) -> bool {
Expand Down

0 comments on commit 687f66d

Please sign in to comment.