fix(lexer): now really handling quotes

This commit is contained in:
Matteo Flebus 2026-01-19 18:19:35 +01:00
parent 95da4a56fa
commit 454bd76abc

View file

@ -236,11 +236,6 @@ static bool update_lexing_mode(char *stream, ssize_t i,
enum lexing_mode *lexing_mode) enum lexing_mode *lexing_mode)
{ {
enum lexing_mode mode_before_update = *lexing_mode; enum lexing_mode mode_before_update = *lexing_mode;
// SECOND quote
if (*lexing_mode == LEXER_QUOTE && stream[i] == '\'')
*lexing_mode = LEXER_NORMAL;
if (*lexing_mode == LEXER_DOUBLE_QUOTE && stream[i] == '"')
*lexing_mode = LEXER_NORMAL;
// FIRST quote // FIRST quote
if (*lexing_mode == LEXER_NORMAL) if (*lexing_mode == LEXER_NORMAL)
@ -251,6 +246,16 @@ static bool update_lexing_mode(char *stream, ssize_t i,
if (stream[i] == '\'') if (stream[i] == '\'')
*lexing_mode = LEXER_QUOTE; *lexing_mode = LEXER_QUOTE;
} }
// SECOND quote
else
{
if (*lexing_mode == LEXER_QUOTE && stream[i] == '\'')
*lexing_mode = LEXER_NORMAL;
if (*lexing_mode == LEXER_DOUBLE_QUOTE && stream[i] == '"')
*lexing_mode = LEXER_NORMAL;
}
return *lexing_mode != mode_before_update; return *lexing_mode != mode_before_update;
} }
@ -270,8 +275,10 @@ struct token *peek_token(void)
while (i < remaining_chars) while (i < remaining_chars)
{ {
// true if we didn't encounter a quotes of any type at stream[i] // true if we didn't encounter a quote of any type at stream[i]
if (!update_lexing_mode(stream, i, &lexing_mode)) // AND we are not inside quotes
if (!update_lexing_mode(stream, i, &lexing_mode)
&& lexing_mode == LEXER_NORMAL)
{ {
if (is_special_char(stream[i])) if (is_special_char(stream[i]))
{ {
@ -309,8 +316,10 @@ struct token *pop_token(void)
while (i < remaining_chars) while (i < remaining_chars)
{ {
// true if we didn't encounter a quotes of any type at stream[i] // true if we didn't encounter a quote of any type at stream[i]
if (!update_lexing_mode(stream, i, &lexing_mode)) // AND we are not inside quotes
if (!update_lexing_mode(stream, i, &lexing_mode)
&& lexing_mode == LEXER_NORMAL)
{ {
if (is_special_char(stream[i])) if (is_special_char(stream[i]))
{ {