diff --git a/src/parser/grammar.lalrpop b/src/parser/grammar.lalrpop index 08251d19fc..2e48d557be 100644 --- a/src/parser/grammar.lalrpop +++ b/src/parser/grammar.lalrpop @@ -46,7 +46,7 @@ use lalrpop_util::ErrorRecovery; use super::{ ExtendedTerm, utils::*, - lexer::{Token, NormalToken, StringToken, MultiStringToken}, + lexer::{Token, NormalToken, StringToken, MultiStringToken, SymbolicStringStart}, error::ParseError, uniterm::*, }; @@ -913,7 +913,8 @@ extern { "\"" => Token::Normal(NormalToken::DoubleQuote), "\"%" => Token::MultiStr(MultiStringToken::End), "m%\"" => Token::Normal(NormalToken::MultiStringStart()), - "symbolic string start" => Token::Normal(NormalToken::SymbolicStringStart((<&'input str>, ))), + "symbolic string start" => Token::Normal(NormalToken::SymbolicStringStart( + SymbolicStringStart{prefix: <&'input str>, percent_count: })), "Num" => Token::Normal(NormalToken::Num), "Dyn" => Token::Normal(NormalToken::Dyn), diff --git a/src/parser/lexer.rs b/src/parser/lexer.rs index c3446359d1..e962a0cf8c 100644 --- a/src/parser/lexer.rs +++ b/src/parser/lexer.rs @@ -35,12 +35,15 @@ use std::ops::Range; fn symbolic_string_prefix_and_length<'input>( lex: &mut logos::Lexer<'input, NormalToken<'input>>, -) -> (&'input str, usize) { +) -> SymbolicStringStart<'input> { let slice = lex.slice(); let (prefix, postfix) = slice .rsplit_once('-') .expect("The logos regexp ensures this succeeds"); - (prefix, postfix.len()) + SymbolicStringStart { + prefix, + percent_count: postfix.len(), + } } // **IMPORTANT** @@ -170,7 +173,7 @@ pub enum NormalToken<'input> { #[regex("m(%+)\"", |lex| lex.slice().len())] MultiStringStart(usize), #[regex("[a-zA-Z][_a-zA-Z0-9-']*-s(%+)\"", symbolic_string_prefix_and_length)] - SymbolicStringStart((&'input str, usize)), + SymbolicStringStart(SymbolicStringStart<'input>), #[token("%tag%")] Tag, @@ -336,6 +339,12 @@ pub const KEYWORDS: &[&str] = &[ "priority", "force", ]; +#[derive(Debug, Clone, PartialEq)] +pub struct SymbolicStringStart<'input> { + pub prefix: &'input str, + pub percent_count: usize, +} + /// The tokens in string mode. #[derive(Logos, Debug, PartialEq, Eq, Clone)] pub enum StringToken<'input> { @@ -620,7 +629,10 @@ impl<'input> Iterator for Lexer<'input> { } Some(Normal( NormalToken::MultiStringStart(delim_size) - | NormalToken::SymbolicStringStart((_, delim_size)), + | NormalToken::SymbolicStringStart(SymbolicStringStart { + percent_count: delim_size, + .. + }), )) => { // for interpolation & closing delimeters we only care about // the number of `%`s (plus the opening `"` or `{`) so we