Expr::Literal contains Literal type which contains only possible types instead of any Value

This commit is contained in:
Erin 2022-04-18 20:56:11 +02:00 committed by ondra05
parent e3d49c9c1f
commit f7cba4b2b6
3 changed files with 42 additions and 30 deletions

View file

@ -153,7 +153,7 @@ pub enum Expr {
kind: BinOpKind, kind: BinOpKind,
}, },
Aint(Box<Spanned<Expr>>), Aint(Box<Spanned<Expr>>),
Literal(Value), Literal(Literal),
Cart(Vec<(Spanned<Expr>, Spanned<Expr>)>), Cart(Vec<(Spanned<Expr>, Spanned<Expr>)>),
Index { Index {
expr: Box<Spanned<Expr>>, expr: Box<Spanned<Expr>>,
@ -163,6 +163,21 @@ pub enum Expr {
Variable(String), Variable(String),
} }
#[derive(Debug, PartialEq, Clone, Hash)]
pub enum Literal {
Int(isize),
Str(String),
}
impl From<Literal> for Value {
fn from(lit: Literal) -> Self {
match lit {
Literal::Int(i) => Self::Int(i),
Literal::Str(s) => Self::Str(s),
}
}
}
#[derive(Debug, PartialEq, Clone, Hash)] #[derive(Debug, PartialEq, Clone, Hash)]
pub enum BinOpKind { pub enum BinOpKind {
Add, Add,

View file

@ -174,7 +174,7 @@ impl ExecEnv {
} }
} }
Aint(expr) => !self.eval_expr(expr)?, Aint(expr) => !self.eval_expr(expr)?,
Literal(value) => value.clone(), Literal(lit) => lit.clone().into(),
Expr::Cart(members) => Value::Cart( Expr::Cart(members) => Value::Cart(
members members
.iter() .iter()
@ -599,9 +599,8 @@ impl ExecEnv {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::ast::Expr;
use super::*; use super::*;
use crate::ast::{Expr, Literal};
#[test] #[test]
fn basic_expression_test() { fn basic_expression_test() {
@ -611,11 +610,11 @@ mod tests {
env.eval_expr(&Spanned { env.eval_expr(&Spanned {
item: Expr::BinOp { item: Expr::BinOp {
lhs: Box::new(Spanned { lhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(2)), item: Expr::Literal(Literal::Int(2)),
span: 1..1, span: 1..1,
}), }),
rhs: Box::new(Spanned { rhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(2)), item: Expr::Literal(Literal::Int(2)),
span: 1..1, span: 1..1,
}), }),
kind: crate::ast::BinOpKind::Add, kind: crate::ast::BinOpKind::Add,
@ -631,18 +630,17 @@ mod tests {
fn type_coercions() { fn type_coercions() {
// The sum of an integer and an aboolean causes an aboolean // The sum of an integer and an aboolean causes an aboolean
// coercion. // coercion.
use crate::variables::Abool;
let env = ExecEnv::new(); let env = ExecEnv::new();
assert_eq!( assert_eq!(
env.eval_expr(&Spanned { env.eval_expr(&Spanned {
item: Expr::BinOp { item: Expr::BinOp {
lhs: Box::new(Spanned { lhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(2)), item: Expr::Literal(Literal::Int(2)),
span: 1..1, span: 1..1,
}), }),
rhs: Box::new(Spanned { rhs: Box::new(Spanned {
item: Expr::Literal(Value::Abool(Abool::Always)), item: Expr::Variable("always".to_owned()),
span: 1..1, span: 1..1,
}), }),
kind: crate::ast::BinOpKind::Add, kind: crate::ast::BinOpKind::Add,
@ -663,11 +661,11 @@ mod tests {
env.eval_expr(&Spanned { env.eval_expr(&Spanned {
item: Expr::BinOp { item: Expr::BinOp {
lhs: Box::new(Spanned { lhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(isize::MAX)), item: Expr::Literal(Literal::Int(isize::MAX)),
span: 1..1, span: 1..1,
}), }),
rhs: Box::new(Spanned { rhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(1)), item: Expr::Literal(Literal::Int(1)),
span: 1..1, span: 1..1,
}), }),
kind: crate::ast::BinOpKind::Add, kind: crate::ast::BinOpKind::Add,
@ -683,11 +681,11 @@ mod tests {
env.eval_expr(&Spanned { env.eval_expr(&Spanned {
item: Expr::BinOp { item: Expr::BinOp {
lhs: Box::new(Spanned { lhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(84)), item: Expr::Literal(Literal::Int(84)),
span: 1..1, span: 1..1,
}), }),
rhs: Box::new(Spanned { rhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(0)), item: Expr::Literal(Literal::Int(0)),
span: 1..1, span: 1..1,
}), }),
kind: crate::ast::BinOpKind::Divide, kind: crate::ast::BinOpKind::Divide,

View file

@ -5,7 +5,6 @@
use crate::ast::*; use crate::ast::*;
use crate::error::{Error, ErrorKind}; use crate::error::{Error, ErrorKind};
use crate::lexer::Token; use crate::lexer::Token;
use crate::variables::Value;
use logos::{Lexer, Logos}; use logos::{Lexer, Logos};
/// Parser structure which holds lexer and metadata /// Parser structure which holds lexer and metadata
@ -173,11 +172,11 @@ impl<'source> Parser<'source> {
start..self.lexer.span().end, start..self.lexer.span().end,
)), )),
Token::Integer(i) => Ok(Spanned::new( Token::Integer(i) => Ok(Spanned::new(
Expr::Literal(Value::Int(i)), Expr::Literal(Literal::Int(i)),
start..self.lexer.span().end, start..self.lexer.span().end,
)), )),
Token::String(s) => Ok(Spanned::new( Token::String(s) => Ok(Spanned::new(
Expr::Literal(Value::Str(if self.tdark { Expr::Literal(Literal::Str(if self.tdark {
s.replace("lang", "script") s.replace("lang", "script")
} else { } else {
s s
@ -614,7 +613,7 @@ mod tests {
lhs: Box::new(Spanned { lhs: Box::new(Spanned {
item: Expr::BinOp { item: Expr::BinOp {
lhs: Box::new(Spanned { lhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(1)), item: Expr::Literal(Literal::Int(1)),
span: 0..1, span: 0..1,
}), }),
rhs: Box::new(Spanned { rhs: Box::new(Spanned {
@ -624,7 +623,7 @@ mod tests {
span: 5..6, span: 5..6,
}), }),
rhs: Box::new(Spanned { rhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(3)), item: Expr::Literal(Literal::Int(3)),
span: 9..10, span: 9..10,
}), }),
kind: BinOpKind::Add, kind: BinOpKind::Add,
@ -636,7 +635,7 @@ mod tests {
span: 0..11, span: 0..11,
}), }),
rhs: Box::new(Spanned { rhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(666)), item: Expr::Literal(Literal::Int(666)),
span: 14..17, span: 14..17,
}), }),
kind: BinOpKind::Divide, kind: BinOpKind::Divide,
@ -660,7 +659,7 @@ mod tests {
span: 4..5, span: 4..5,
}, },
init: Some(Spanned { init: Some(Spanned {
item: Expr::Literal(Value::Int(42)), item: Expr::Literal(Literal::Int(42)),
span: 8..10, span: 8..10,
}), }),
}, },
@ -692,7 +691,7 @@ mod tests {
}, },
body: vec![Spanned { body: vec![Spanned {
item: Stmt::Print(Spanned { item: Stmt::Print(Spanned {
item: Expr::Literal(Value::Str("Buy Able products!".to_owned())), item: Expr::Literal(Literal::Str("Buy Able products!".to_owned())),
span: 19..39, span: 19..39,
}), }),
span: 19..46, span: 19..46,
@ -717,7 +716,7 @@ mod tests {
init: Some(Spanned { init: Some(Spanned {
item: Expr::BinOp { item: Expr::BinOp {
lhs: Box::new(Spanned { lhs: Box::new(Spanned {
item: Expr::Literal(Value::Str("script".to_owned())), item: Expr::Literal(Literal::Str("script".to_owned())),
span: 20..26, span: 20..26,
}), }),
rhs: Box::new(Spanned { rhs: Box::new(Spanned {
@ -744,28 +743,28 @@ mod tests {
item: Expr::Cart(vec![ item: Expr::Cart(vec![
( (
Spanned { Spanned {
item: Expr::Literal(Value::Str("able".to_owned())), item: Expr::Literal(Literal::Str("able".to_owned())),
span: 1..7, span: 1..7,
}, },
Spanned { Spanned {
item: Expr::Literal(Value::Int(1)), item: Expr::Literal(Literal::Int(1)),
span: 11..12, span: 11..12,
}, },
), ),
( (
Spanned { Spanned {
item: Expr::Literal(Value::Str("script".to_owned())), item: Expr::Literal(Literal::Str("script".to_owned())),
span: 14..22, span: 14..22,
}, },
Spanned { Spanned {
item: Expr::BinOp { item: Expr::BinOp {
kind: BinOpKind::Subtract, kind: BinOpKind::Subtract,
lhs: Box::new(Spanned { lhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(3)), item: Expr::Literal(Literal::Int(3)),
span: 26..27, span: 26..27,
}), }),
rhs: Box::new(Spanned { rhs: Box::new(Spanned {
item: Expr::Literal(Value::Int(1)), item: Expr::Literal(Literal::Int(1)),
span: 30..31, span: 30..31,
}), }),
}, },
@ -791,18 +790,18 @@ mod tests {
expr: Box::new(Spanned { expr: Box::new(Spanned {
item: Expr::Cart(vec![( item: Expr::Cart(vec![(
Spanned { Spanned {
item: Expr::Literal(Value::Str("able".to_owned())), item: Expr::Literal(Literal::Str("able".to_owned())),
span: 1..7, span: 1..7,
}, },
Spanned { Spanned {
item: Expr::Literal(Value::Str("ablecorp".to_owned())), item: Expr::Literal(Literal::Str("ablecorp".to_owned())),
span: 11..21, span: 11..21,
}, },
)]), )]),
span: 0..22, span: 0..22,
}), }),
index: Box::new(Spanned { index: Box::new(Spanned {
item: Expr::Literal(Value::Str("ablecorp".to_owned())), item: Expr::Literal(Literal::Str("ablecorp".to_owned())),
span: 23..33, span: 23..33,
}), }),
}, },