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