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