From 6bf1c8f7d16d8497cbd79c1282a17f682ed986eb Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 18 Nov 2022 13:39:11 +0100 Subject: [PATCH] Parse literals --- src/parser.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 149d985..e1d4964 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -80,7 +80,7 @@ fn num_lit() -> impl Parser + Clone { fn string_lit() -> impl Parser { // TODO Parse string literals - filter(|_| false).to(unreachable!()) + filter(|_| false).map(|_| unreachable!()) } fn table_lit_elem( @@ -127,7 +127,21 @@ fn table_lit( }) } -pub fn parser() -> impl Parser { - let expr = num_lit().map(|n| Expr::Lit(Lit::Num(n))); - table_lit(expr).padded().then_ignore(end()) +fn lit( + expr: impl Parser + Clone, +) -> impl Parser { + let nil = text::keyword("nil").map_with_span(|_, span| Lit::Nil(span)); + let r#true = text::keyword("true").map_with_span(|_, span| Lit::Bool(true, span)); + let r#false = text::keyword("false").map_with_span(|_, span| Lit::Bool(false, span)); + let num = num_lit().map(Lit::Num); + let string = string_lit().map(Lit::String); + let table = table_lit(expr).map(Lit::Table); + + nil.or(r#true).or(r#false).or(num).or(string).or(table) +} + +pub fn parser() -> impl Parser { + recursive(|expr| lit(expr).map(Expr::Lit)) + .padded() + .then_ignore(end()) }