diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-25 21:10:11 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-25 21:15:26 +0200 |
commit | 4b1d129ccba44bc53026387a20fc9b19dd21a1a8 (patch) | |
tree | d419a02d63b549652dc1b1fc672425e6cb6550ae /crates/rebel-parse | |
parent | 14be157edccaace010edcf41555174babb984260 (diff) | |
download | rebel-4b1d129ccba44bc53026387a20fc9b19dd21a1a8.tar rebel-4b1d129ccba44bc53026387a20fc9b19dd21a1a8.zip |
rebel-parse: tokenize: add support for string interpolation
Diffstat (limited to 'crates/rebel-parse')
-rw-r--r-- | crates/rebel-parse/src/grammar/tokenize.rs | 19 |
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'] |