lexer: resolve small regex ambiguity

This commit is contained in:
Guillem L. Jara
2026-05-10 18:42:52 +02:00
parent df63f636f8
commit 84b83de4bf
+9 -4
View File
@@ -139,7 +139,7 @@ pub enum Token<'a> {
Minus,
#[token("*", accept_expression)]
Star,
#[token("/", parse_regex_or_slash)]
#[token("/", parse_regex_or_op)]
Slash,
/// Not generated by Logos directly.
Regex(Slice<'a>),
@@ -160,7 +160,7 @@ pub enum Token<'a> {
MinusAssign,
#[token("*=", accept_expression)]
StarAssign,
#[token("/=", accept_expression)]
/// Not generated by Logos directly.
SlashAssign,
#[token("%=", accept_expression)]
PercentAssign,
@@ -313,7 +313,7 @@ fn parse_string<'a>(lex: &mut logos::Lexer<'a, Token<'a>>) -> Result<Slice<'a>>
parse_content::<false, '"'>(lex)
}
fn parse_regex_or_slash<'a>(lex: &mut logos::Lexer<'a, Token<'a>>) -> Result<Token<'a>> {
fn parse_regex_or_op<'a>(lex: &mut logos::Lexer<'a, Token<'a>>) -> Result<Token<'a>> {
match lex.extras.ctx {
Context::AcceptExpression => {
accept_operator(lex);
@@ -321,7 +321,12 @@ fn parse_regex_or_slash<'a>(lex: &mut logos::Lexer<'a, Token<'a>>) -> Result<Tok
}
Context::AcceptOperator => {
accept_expression(lex);
Ok(Token::Slash)
if lex.remainder().first() == Some(&b'=') {
lex.bump(1);
Ok(Token::SlashAssign)
} else {
Ok(Token::Slash)
}
}
}
}