Implement the not operator
This commit is contained in:
parent
df22460010
commit
7d49fc53ae
4 changed files with 15 additions and 33 deletions
|
@ -144,7 +144,7 @@ impl<'a, T: Iterator<Item = token::Token<'a>>> Parser<'a, T> {
|
||||||
fn primary(&mut self) -> Result<ASTNode> {
|
fn primary(&mut self) -> Result<ASTNode> {
|
||||||
let node = match self.token_iter.next().map(|it| it.token_type) {
|
let node = match self.token_iter.next().map(|it| it.token_type) {
|
||||||
Some(TokenType::False) => ASTNode::Literal(astnode::Literal::Bool(false)),
|
Some(TokenType::False) => ASTNode::Literal(astnode::Literal::Bool(false)),
|
||||||
Some(TokenType::True) => ASTNode::Literal(astnode::Literal::Bool(false)),
|
Some(TokenType::True) => ASTNode::Literal(astnode::Literal::Bool(true)),
|
||||||
Some(TokenType::Int(i)) => ASTNode::Literal(astnode::Literal::Int(i)),
|
Some(TokenType::Int(i)) => ASTNode::Literal(astnode::Literal::Int(i)),
|
||||||
Some(TokenType::String(i)) => ASTNode::Literal(astnode::Literal::String(i)),
|
Some(TokenType::String(i)) => ASTNode::Literal(astnode::Literal::String(i)),
|
||||||
Some(TokenType::Float(f)) => ASTNode::Literal(astnode::Literal::Float(f)),
|
Some(TokenType::Float(f)) => ASTNode::Literal(astnode::Literal::Float(f)),
|
||||||
|
|
|
@ -47,9 +47,9 @@ impl Interpret for astnode::BinaryExpr {
|
||||||
|
|
||||||
impl Interpret for astnode::UnaryExpr {
|
impl Interpret for astnode::UnaryExpr {
|
||||||
fn interpret(&self) -> Result<types::Value, RuntimeError> {
|
fn interpret(&self) -> Result<types::Value, RuntimeError> {
|
||||||
let _val = self.right.interpret();
|
let val = self.right.interpret()?;
|
||||||
match self.operator {
|
match self.operator {
|
||||||
UnaryOperator::Bang => todo!(),
|
UnaryOperator::Bang => Ok(types::Value::Bool(!val.truthy())),
|
||||||
UnaryOperator::Minus => todo!(),
|
UnaryOperator::Minus => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,48 +2,31 @@ use crate::ast::astnode;
|
||||||
use from_variants::FromVariants;
|
use from_variants::FromVariants;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, PartialOrd, FromVariants)]
|
#[derive(Debug, PartialEq, PartialOrd, FromVariants)]
|
||||||
pub enum Primitive {
|
pub enum Value {
|
||||||
Int(i32),
|
Int(i32),
|
||||||
Float(f32),
|
Float(f32),
|
||||||
Bool(bool),
|
Bool(bool),
|
||||||
Null,
|
Null,
|
||||||
}
|
// TODO: create a cow(not rust cow) string instead of cloning a normal string
|
||||||
|
String(String),
|
||||||
#[derive(Debug, PartialEq, PartialOrd, FromVariants)]
|
|
||||||
pub enum Value {
|
|
||||||
#[from_variants(into)]
|
|
||||||
Primitive(Primitive),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<astnode::Literal> for Value {
|
impl From<astnode::Literal> for Value {
|
||||||
fn from(l: astnode::Literal) -> Self {
|
fn from(l: astnode::Literal) -> Self {
|
||||||
match_any::match_any!(l,
|
match_any::match_any!(l,
|
||||||
astnode::Literal::Int(v) | astnode::Literal::Bool(v)| astnode::Literal::Float(v) => v.into(),
|
astnode::Literal::Int(v) | astnode::Literal::Bool(v) | astnode::Literal::Float(v) | astnode::Literal::String(v) => v.into()
|
||||||
astnode::Literal::String(_s) => todo!()
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Value {
|
|
||||||
pub fn int(i: i32) -> Value {
|
|
||||||
Value::Primitive(Primitive::Int(i))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn float(f: f32) -> Value {
|
|
||||||
Value::Primitive(Primitive::Float(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn bool(b: bool) -> Value {
|
|
||||||
Value::Primitive(Primitive::Bool(b))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn null() -> Value {
|
|
||||||
Value::Primitive(Primitive::Null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Value {
|
impl Default for Value {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self::null()
|
Self::Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Value {
|
||||||
|
pub fn truthy(&self) -> bool {
|
||||||
|
!(matches!(*self, Self::Bool(false)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
use crftng_intrprtrs::interpreter::types;
|
|
||||||
use crftng_intrprtrs::run;
|
use crftng_intrprtrs::run;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -12,5 +11,5 @@ fn test_one_equality() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_check_result_eq_bool(code: &str, value: bool) {
|
fn run_check_result_eq_bool(code: &str, value: bool) {
|
||||||
assert_eq!(run(code).unwrap(), types::Value::bool(value))
|
assert_eq!(run(code).unwrap(), value.into())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue