summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2024-04-25 21:10:11 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2024-04-25 21:15:26 +0200
commit4b1d129ccba44bc53026387a20fc9b19dd21a1a8 (patch)
treed419a02d63b549652dc1b1fc672425e6cb6550ae
parent14be157edccaace010edcf41555174babb984260 (diff)
downloadrebel-4b1d129ccba44bc53026387a20fc9b19dd21a1a8.tar
rebel-4b1d129ccba44bc53026387a20fc9b19dd21a1a8.zip
rebel-parse: tokenize: add support for string interpolation
-rw-r--r--crates/rebel-parse/src/grammar/tokenize.rs19
1 files changed, 16 insertions, 3 deletions
diff --git a/crates/rebel-parse/src/grammar/tokenize.rs b/crates/rebel-parse/src/grammar/tokenize.rs
index 811da0d..8ca9d59 100644
--- a/crates/rebel-parse/src/grammar/tokenize.rs
+++ b/crates/rebel-parse/src/grammar/tokenize.rs
@@ -45,16 +45,17 @@ peg::parser! {
kind: StringKind::RawString,
}
}
- / "```" newline() chars:$((!"```" [_])+) "```" {
+ / "```" newline() pieces:script_string_piece()* "```" {
String {
- pieces: vec![StringPiece::Chars(chars)],
+ pieces,
kind: StringKind::ScriptString,
}
}
rule string_piece() -> StringPiece<'input>
- = chars:$([^'"' | '\\']+) { StringPiece::Chars(chars) }
+ = chars:$((!"{{" [^'"' | '\\'])+) { StringPiece::Chars(chars) }
/ "\\" escape:string_escape() { StringPiece::Escape(escape) }
+ / string_interp()
rule string_escape() -> char
= "n" { '\n' }
@@ -70,6 +71,18 @@ peg::parser! {
u32::from_str_radix(digits, 16).unwrap().try_into().or(Err("Invalid unicode escape"))
}
+ rule script_string_piece() -> StringPiece<'input>
+ = chars:$((!"{{" !"```" [_])+) { StringPiece::Chars(chars) }
+ / string_interp()
+
+ rule string_interp() -> StringPiece<'input>
+ = "{{" tokens:subtoken()* "}}" {
+ StringPiece::Interp(TokenStream(tokens))
+ }
+
+ rule subtoken() -> Token<'input>
+ = !"}}" token:token() { token }
+
rule hex_digit()
= ['0'..='9' | 'a'..='f' | 'A'..='F']