From 7a1df3f58d890ae0e3c0f41426fc056c1b84e124 Mon Sep 17 00:00:00 2001 From: mars Date: Wed, 2 Mar 2022 12:40:46 -0700 Subject: [PATCH] Lex and parse string literals --- src/lexer.rs | 3 +++ src/parse.rs | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/src/lexer.rs b/src/lexer.rs index b47ab52..c4394f9 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -82,6 +82,9 @@ pub enum Token { #[regex(r"([0-9]+([.][0-9]*)?|[.][0-9]+)")] DecimalFloat, + #[regex(r#""([^"\\]|\\t|\\u|\\n|\\")*""#)] + StringLiteral, + #[regex(r"//[^\n]*", logos::skip)] SingleLineComment, diff --git a/src/parse.rs b/src/parse.rs index b3cd9d1..bd54d21 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -369,6 +369,7 @@ impl<'a> Expr<'a> { Token::HexInteger => Self::Literal(Literal::HexInteger(lexer.slice())), Token::DecimalInteger => Self::Literal(Literal::DecimalInteger(lexer.slice())), Token::DecimalFloat => Self::Literal(Literal::DecimalFloat(lexer.slice())), + Token::StringLiteral => Self::Literal(Literal::String(lexer.slice())), Token::True => Self::Literal(Literal::Boolean(true)), Token::False => Self::Literal(Literal::Boolean(false)), Token::Semicolon | Token::BraceClose | Token::ParanClose => return (None, tok), @@ -477,6 +478,7 @@ pub enum Literal<'a> { HexInteger(&'a str), DecimalInteger(&'a str), DecimalFloat(&'a str), + String(&'a str), Boolean(bool), } @@ -579,6 +581,11 @@ mod tests { parse_expr("0.1 + .1 * 1.;"); } + #[test] + fn string_literals() { + parse_expr("\"String contents\";"); + } + #[test] fn locals() { parse_expr("local1 + local2 - local3;");