From 8aba492f151b7eaaab706c842862d58144770305 Mon Sep 17 00:00:00 2001 From: Araozu Date: Fri, 10 Feb 2023 12:30:10 -0500 Subject: [PATCH] Parse strings and booleans --- src/ast_types.rs | 2 ++ src/codegen/expression.rs | 25 ++++++++++++++++++++++++- src/syntax/expression.rs | 18 ++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/ast_types.rs b/src/ast_types.rs index afdc884..c8d65ac 100644 --- a/src/ast_types.rs +++ b/src/ast_types.rs @@ -20,4 +20,6 @@ pub struct VarBinding<'a> { pub enum Expression<'a> { Number(&'a String), + String(&'a String), + Boolean(bool), } diff --git a/src/codegen/expression.rs b/src/codegen/expression.rs index 8de91df..a4ed8ce 100644 --- a/src/codegen/expression.rs +++ b/src/codegen/expression.rs @@ -7,6 +7,12 @@ impl Transpilable for Expression<'_> { Expression::Number(value) => { String::from(*value) } + Expression::String(value) => { + format!("\"{}\"", *value) + } + Expression::Boolean(value) => { + String::from(if *value {"true"} else {"false"}) + } } } } @@ -18,11 +24,28 @@ mod tests { use crate::ast_types::Expression; #[test] - fn number_should_transpile() { + fn should_transpile_number() { let str = String::from("42"); let exp = Expression::Number(&str); let result = exp.transpile(); assert_eq!("42", result); } + + #[test] + fn should_transpile_string() { + let str = String::from("Hello world"); + let exp = Expression::String(&str); + let result = exp.transpile(); + + assert_eq!("\"Hello world\"", result); + } + + #[test] + fn should_transpile_boolean() { + let exp = Expression::Boolean(true); + let result = exp.transpile(); + + assert_eq!("true", result); + } } diff --git a/src/syntax/expression.rs b/src/syntax/expression.rs index 59d14bd..c4cd3b7 100644 --- a/src/syntax/expression.rs +++ b/src/syntax/expression.rs @@ -10,6 +10,12 @@ pub fn try_parse(tokens: &Vec, pos: usize) -> Option { TokenType::Number => { Some(Expression::Number(&token.value)) } + TokenType::String => { + Some(Expression::String(&token.value)) + } + TokenType::Identifier if token.value == "true" || token.value == "false" => { + Some(Expression::Boolean(token.value == "true")) + } _ => None } }) @@ -28,6 +34,18 @@ mod tests { match expression { Expression::Number(value) => assert_eq!("40", value), + _ => panic!() + } + } + + #[test] + fn should_parse_a_string() { + let tokens = get_tokens(&String::from("\"Hello\"")).unwrap(); + let expression = try_parse(&tokens, 0).unwrap(); + + match expression { + Expression::String(value) => assert_eq!("Hello", value), + _ => panic!() } } }