Add 'simple variable' interpolation like "$var"

This commit is contained in:
Olivier 'reivilibre' 2024-05-01 22:43:10 +01:00
parent f638ec66b4
commit 7171145aa5
2 changed files with 13 additions and 3 deletions

View File

@ -125,20 +125,21 @@ lineEnd = _{ ws_nocnl* ~ nlOrEoi ~ (ws_nocnl* ~ NEWLINE)* ~ (ws_nocnl* ~ &EOI)?
// was: lineEnd = _{ ws_nocnl* ~ nlOrEoi ~ (!EOI ~ ws* ~ nlOrEoi)* } // was: lineEnd = _{ ws_nocnl* ~ nlOrEoi ~ (!EOI ~ ws* ~ nlOrEoi)* }
SingleStringContent = { (!("'" | "\\" | "$") ~ ANY)+ } SingleStringContent = { (!("'" | "\\" | "$") ~ ANY)+ }
singleString = _{ !("''") ~ "'" ~ (SingleStringContent | SEscape | SInterpol)* ~ "'" } singleString = _{ !("''") ~ "'" ~ (SingleStringContent | SEscape | SSimpleVarInterpol | SInterpol)* ~ "'" }
DoubleStringContent = { (!("\"" | "\\" | "$") ~ ANY)+ } DoubleStringContent = { (!("\"" | "\\" | "$") ~ ANY)+ }
doubleString = _{ "\"" ~ (DoubleStringContent | SEscape | SInterpol)* ~ "\"" } doubleString = _{ "\"" ~ (DoubleStringContent | SEscape | SSimpleVarInterpol | SInterpol)* ~ "\"" }
blockStringStart = _{ "''" ~ NEWLINE ~ PEEK_ALL } blockStringStart = _{ "''" ~ NEWLINE ~ PEEK_ALL }
blockStringEnd = _{ NEWLINE ~ (" " | "\t")* ~ "''" } blockStringEnd = _{ NEWLINE ~ (" " | "\t")* ~ "''" }
BlockStringContent = { (!(NEWLINE | blockStringEnd | "\\" | "$" | "@") ~ ANY)+ } BlockStringContent = { (!(NEWLINE | blockStringEnd | "\\" | "$" | "@") ~ ANY)+ }
// This rule becomes just \n later on, so it effectively strips leading indentation! // This rule becomes just \n later on, so it effectively strips leading indentation!
BlockStringNewline = { !blockStringEnd ~ NEWLINE ~ PEEK_ALL } BlockStringNewline = { !blockStringEnd ~ NEWLINE ~ PEEK_ALL }
blockString = _{ blockStringStart ~ (BlockStringContent | SEscape | SInterpol | ParameterisedLocalisation | BlockStringNewline)* ~ blockStringEnd } blockString = _{ blockStringStart ~ (BlockStringContent | SEscape | SSimpleVarInterpol | SInterpol | ParameterisedLocalisation | BlockStringNewline)* ~ blockStringEnd }
String = { blockString | singleString | doubleString | ParameterisedLocalisation } String = { blockString | singleString | doubleString | ParameterisedLocalisation }
SEscape = { "\\" ~ ("\\" | "'" | "\"" | "$" | "@") } SEscape = { "\\" ~ ("\\" | "'" | "\"" | "$" | "@") }
SSimpleVarInterpol = { "$" ~ Identifier }
SInterpol = { "${" ~ ws* ~ Expr ~ ws* ~ "}" } SInterpol = { "${" ~ ws* ~ Expr ~ ws* ~ "}" }

View File

@ -205,8 +205,17 @@ impl HornbeamParser {
fn String(input: Node) -> PCResult<StringExpr> { fn String(input: Node) -> PCResult<StringExpr> {
let mut pieces = Vec::new(); let mut pieces = Vec::new();
for node in input.into_children() { for node in input.into_children() {
let loc = nodeloc(&node);
match node.as_rule() { match node.as_rule() {
Rule::SEscape => pieces.push(StringPiece::Literal(HornbeamParser::SEscape(node)?)), Rule::SEscape => pieces.push(StringPiece::Literal(HornbeamParser::SEscape(node)?)),
Rule::SSimpleVarInterpol => {
let var_identifier =
HornbeamParser::Identifier(node.into_children().single()?)?;
pieces.push(StringPiece::Interpolation(Expression::Variable {
name: var_identifier,
loc,
}));
}
Rule::SInterpol => pieces.push(StringPiece::Interpolation(HornbeamParser::Expr( Rule::SInterpol => pieces.push(StringPiece::Interpolation(HornbeamParser::Expr(
node.into_children().single()?, node.into_children().single()?,
)?)), )?)),