From 1cb196571f8784deb0afb3d03eb87cb395fa7102 Mon Sep 17 00:00:00 2001 From: Olivier Date: Wed, 11 Jun 2025 22:17:49 +0100 Subject: [PATCH] Add `true` and `false` literals --- hornbeam_grammar/src/ast.rs | 1 + hornbeam_grammar/src/hornbeam.pest | 4 +++- hornbeam_grammar/src/parser.rs | 2 ++ hornbeam_interpreter/src/engine.rs | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hornbeam_grammar/src/ast.rs b/hornbeam_grammar/src/ast.rs index fbb2375..2745082 100644 --- a/hornbeam_grammar/src/ast.rs +++ b/hornbeam_grammar/src/ast.rs @@ -199,6 +199,7 @@ pub enum Expression { IntLiteral { val: i64, }, + BoolLiteral(bool), NoneLiteral, StringExpr(StringExpr), diff --git a/hornbeam_grammar/src/hornbeam.pest b/hornbeam_grammar/src/hornbeam.pest index f579bca..78d6f97 100644 --- a/hornbeam_grammar/src/hornbeam.pest +++ b/hornbeam_grammar/src/hornbeam.pest @@ -220,11 +220,13 @@ MethodCall = { "." ~ ws* ~ Identifier ~ "(" ~ commaSeparatedExprs ~ ")" } FieldLookup = { "." ~ ws* ~ Identifier } Indexing = { "[" ~ ws* ~ Expr ~ ws* ~ "]" } -Term = _{ (IntLiteral | bracketedTerm | FunctionCall | ListLiteral | MapLiteral | String | Variable | NoneLiteral) } +Term = _{ (IntLiteral | bracketedTerm | FunctionCall | ListLiteral | MapLiteral | String | Variable | NoneLiteral | TrueLiteral | FalseLiteral) } bracketedTerm = _{ "(" ~ Expr ~ ")" } NoneLiteral = { "None" } +TrueLiteral = { "true" } +FalseLiteral = { "false" } IntLiteral = @{ (ASCII_NONZERO_DIGIT ~ ASCII_DIGIT+ | ASCII_DIGIT) } // `-` is important in identifiers for `kebab-case` HTML element attributes // We could consider splitting this out into its own kind of identifier but let's not bother now. diff --git a/hornbeam_grammar/src/parser.rs b/hornbeam_grammar/src/parser.rs index 4eff086..86ba942 100644 --- a/hornbeam_grammar/src/parser.rs +++ b/hornbeam_grammar/src/parser.rs @@ -404,6 +404,8 @@ impl HornbeamParser { Ok(match node.as_rule() { Rule::IntLiteral => Expression::IntLiteral { val: node.as_str().parse().map_err(|e| error(&format!("can't parse int: {e:?}"), node.as_span()))? }, Rule::NoneLiteral => Expression::NoneLiteral, + Rule::TrueLiteral => Expression::BoolLiteral(true), + Rule::FalseLiteral => Expression::BoolLiteral(false), Rule::String => Expression::StringExpr(HornbeamParser::String(node)?), Rule::Variable => HornbeamParser::Variable(node)?, Rule::FunctionCall => HornbeamParser::FunctionCall(node)?, diff --git a/hornbeam_interpreter/src/engine.rs b/hornbeam_interpreter/src/engine.rs index 7ca67e6..332cc51 100644 --- a/hornbeam_interpreter/src/engine.rs +++ b/hornbeam_interpreter/src/engine.rs @@ -749,6 +749,7 @@ impl<'a, O: OutputSystem + Send, LS: LocalisationSystem + Sync + Send> Interpret Ok(Value::List(result)) } Expression::IntLiteral { val } => Ok(Value::Int(*val)), + Expression::BoolLiteral(val) => Ok(Value::Bool(*val)), Expression::NoneLiteral => Ok(Value::Reflective(Box::new(None::<()>))), Expression::StringExpr(sexpr) => { let mut output = String::new();