Ответ 1
Вы найдете эти ссылки полезными
Я экспериментирую, чтобы узнать flex и хотел бы соответствовать строковым литералам. В настоящее время мой код выглядит следующим образом:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
Я борюсь с вариациями в течение часа или около того и не могу заставить его работать так, как должно. Я по существу надеялся сопоставить строковый литерал, который не может содержать новую строку (если только она не экранирована) и поддерживает экранированные символы.
Я, вероятно, просто пишу плохое регулярное выражение или несовместимое с flex. Пожалуйста, советую!
Вы найдете эти ссылки полезными
Строка состоит из метки кавычки
"
за которым следует ноль или больше либо сбежавшего ничего
\\.
или символ без кавычек
[^"\\]
и, наконец, завершающая цитата
"
Поместите все это вместе, и у вас есть
\"(\\.|[^"\\])*\"
Кавычки с разделителями экранируются, потому что они являются метасимволами Flex.
Для одной строки... вы можете использовать это:
\"([^\\\"]|\\.)*\" {/*matches string-literal on a single line*/;}
Как использовать начальное состояние...
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 обнаруживает цитату, он переключается в другое состояние, а затем продолжает лексирование, пока не достигнет другой цитаты, в котором он возвращается в нормальное состояние.
Ответ, который приходит поздно, но который может быть полезен для следующего, кто будет ему нужен:
\"(([^\"]|\\\")*[^\\])?\"