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

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

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

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

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

6 ответов



строка состоит из кавычки

"

с последующим нулем или более того либо сбежал что-нибудь

\.

или не-кавычки

[^"\]

и, наконец, окончательная цитата

"

сложите все вместе, и у вас есть

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

разделительные кавычки экранируются, потому что они являются мета-символами 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 обнаруживает цитату, он переключается в другое состояние, а затем продолжает лексирование, пока не достигнет другой цитаты, в которой он возвращается в нормальное состояние.


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

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

это то, что мы используем в Zolang для однострочных строковых литералов со встроенными шаблонами ${...}

\"($\{.*\}|\.|[^\"\])*\"