Ответ на этот вопрос похож на тот, который я написал здесь . Это можно сделать написав свой конечный автомат в lex. Это также можно сделать, написав некоторый код C , как показано в цитируемом ответе или в других текстах, цитируемых ниже.
Если мы предполагаем, что требуемая строка всегда находится между "strg" и "lngt", то это то же самое, что и любые другие несимметричные разделители строк.
%x STRG LETTERL LN LNG LNGT
ws [ \t\r\n]+
%%
<INITIAL>"strg: " {
BEGIN(STRG);
}
<STRG>[^l]*l {
yymore();
BEGIN(LETTERL);
}
<LETTERL>n {
yymore();
BEGIN(LN);
}
<LN>g {
yymore();
BEGIN(LNG);
}
<LNG>t {
yymore();
BEGIN(LNGT);
}
<LNGT>":" {
printf("String is '%s'\n", yytext);
BEGIN(INITIAL);
}
<LETTERL>[^n] {
BEGIN(STRG);
yymore();
}
<LN>[^g] {
BEGIN(STRG);
yymore();
}
<LNG>[^t] {
BEGIN(STRG);
yymore();
}
<LNGT>[^:] {
BEGIN(STRG);
yymore();
}
<INITIAL>{ws} /* skip */ ;
<INITIAL>. /* skip anything not in the string */
%%
Процитирую другой мой ответ:
Предлагаются решения по нескольким университетским курсам по компиляции. Тот, кто хорошо это объясняет, - здесь (в Манчестере) . Который цитирует пару хороших книг, которые также охватывают проблемы:
- Дж. Левин, Т. Мейсон и Д. Браун: Лекс и Як (2-е изд.)
- M.E.Lesk & E.Schmidt: Lex - Генератор лексического анализатора
Описаны два метода: Начальные условия для подробного определения конечного автомата или ручной ввод для непосредственного чтения символов.