From 5d01f1caf900e9666efda25fbe35911154596f0c Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 7 Aug 2024 10:50:19 -0400 Subject: [PATCH] Implement parsing and evaluation of boolean expressions --- dust-lang/src/lex.rs | 2 +- dust-lang/src/parse.rs | 18 +++++++++++++++++ dust-lang/src/vm.rs | 44 ++++++++++++++---------------------------- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/dust-lang/src/lex.rs b/dust-lang/src/lex.rs index c6a71a8..0c30285 100644 --- a/dust-lang/src/lex.rs +++ b/dust-lang/src/lex.rs @@ -124,7 +124,7 @@ impl<'a> Lexer<'a> { self.source[self.position..].chars().nth(1) } - fn peek_until_whitespace(&self) -> Option<&str> { + fn _peek_until_whitespace(&self) -> Option<&str> { let start = self.position; let end = self.source[self.position..] .find(char::is_whitespace) diff --git a/dust-lang/src/parse.rs b/dust-lang/src/parse.rs index e213c27..a0840e8 100644 --- a/dust-lang/src/parse.rs +++ b/dust-lang/src/parse.rs @@ -105,6 +105,14 @@ impl<'src> Parser<'src> { fn parse_primary(&mut self) -> Result { match self.current.clone() { + (Token::Boolean(boolean), span) => { + self.next_token()?; + + Ok(Node::new( + Statement::Constant(Value::boolean(boolean)), + span, + )) + } (Token::Float(float), span) => { self.next_token()?; @@ -213,6 +221,16 @@ mod tests { use super::*; + #[test] + fn boolean() { + let input = "true"; + + assert_eq!( + parse(input), + Ok([Node::new(Statement::Constant(Value::boolean(true)), (0, 4))].into()) + ); + } + #[test] fn list_access() { let input = "[1, 2, 3].0"; diff --git a/dust-lang/src/vm.rs b/dust-lang/src/vm.rs index 92d0b43..d7d611c 100644 --- a/dust-lang/src/vm.rs +++ b/dust-lang/src/vm.rs @@ -144,16 +144,6 @@ impl Vm { }); } } - _ => { - return Err(VmError::ExpectedDifferentReservedIdentifier { - position: right_span, - expected: vec![ - ReservedIdentifier::IsEven, - ReservedIdentifier::IsOdd, - ReservedIdentifier::Length, - ], - }) - } } } @@ -181,25 +171,11 @@ pub enum VmError { // Anaylsis Failures // These should be prevented by running the analyzer before the VM - ExpectedIdentifier { - position: Span, - }, - ExpectedIdentifierOrInteger { - position: Span, - }, - ExpectedInteger { - position: Span, - }, - ExpectedList { - position: Span, - }, - ExpectedDifferentReservedIdentifier { - position: Span, - expected: Vec, - }, - ExpectedValue { - position: Span, - }, + ExpectedIdentifier { position: Span }, + ExpectedIdentifierOrInteger { position: Span }, + ExpectedInteger { position: Span }, + ExpectedList { position: Span }, + ExpectedValue { position: Span }, } impl From for VmError { @@ -218,6 +194,16 @@ impl From for VmError { mod tests { use super::*; + #[test] + fn boolean() { + let input = "true"; + + assert_eq!( + run(input, &mut HashMap::new()), + Ok(Some(Value::boolean(true))) + ); + } + #[test] fn is_even() { let input = "42.is_even";