Регулярное выражение для строкового литерала в 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 для однострочных строковых литералов со встроенными шаблонами ${...}
\"($\{.*\}|\.|[^\"\])*\"