Подтвердить что ты не робот

Регулярное выражение для строкового литерала в flex/lex

Я экспериментирую, чтобы узнать flex и хотел бы соответствовать строковым литералам. В настоящее время мой код выглядит следующим образом:

"\""([^\n\"\\]*(\\[.\n])*)*"\""        {/*matches string-literal*/;}

Я борюсь с вариациями в течение часа или около того и не могу заставить его работать так, как должно. Я по существу надеялся сопоставить строковый литерал, который не может содержать новую строку (если только она не экранирована) и поддерживает экранированные символы.

Я, вероятно, просто пишу плохое регулярное выражение или несовместимое с flex. Пожалуйста, советую!

4b9b3361

Ответ 2

Строка состоит из метки кавычки

"

за которым следует ноль или больше либо сбежавшего ничего

\\.

или символ без кавычек

[^"\\]

и, наконец, завершающая цитата

"

Поместите все это вместе, и у вас есть

\"(\\.|[^"\\])*\"

Кавычки с разделителями экранируются, потому что они являются метасимволами Flex.

Ответ 3

Для одной строки... вы можете использовать это:

\"([^\\\"]|\\.)*\"  {/*matches string-literal on a single line*/;}

Ответ 4

Как использовать начальное состояние...

int enter_dblquotes = 0;

%x DBLQUOTES
%%

\"  { BEGIN(DBLQUOTES); enter_dblquotes++; }

<DBLQUOTES>*\" 
{ 
   if (enter_dblquotes){
       handle_this_dblquotes(yytext); 
       BEGIN(INITIAL); /* revert back to normal */
       enter_dblquotes--; 
   } 
}
         ...more rules follow...

Он был похож на этот эффект (flex использует %s или %x, чтобы указать, какое состояние будет ожидаться. Когда вход flex обнаруживает цитату, он переключается в другое состояние, а затем продолжает лексирование, пока не достигнет другой цитаты, в котором он возвращается в нормальное состояние.

Ответ 5

Ответ, который приходит поздно, но который может быть полезен для следующего, кто будет ему нужен:

\"(([^\"]|\\\")*[^\\])?\"