Как сопоставить шаблон R
, только если ему предшествует другой шаблон S
без чтения S
(чтобы дать S
сопоставленный ввод обратно lex )?
file.l:
%%
\\foo {
yytext++; // To remove the starting backslash
printf("%s\n", yytext);
}
\\ printf("backslash!\n");
.
%%
int main() {
yylex();
}
В приведенном выше примере я хочу принять foo
только тогда, когда ему предшествует обратная косая черта sh \
. Но в моей текущей реализации я ем \
, который соответствует ниже.
Для проверки запустить как:
lex file.l
gcc -lfl lex.yy.c
./a.out
Редактировать 1:
I попытался использовать unput как предложено @rici. Но, как я реализовал, есть строки, имеющие оба шаблона, которые не обнаруживают оба шаблона.
Как bar\foo
%%
\\foo {
yytext++; // To remove the starting backslash
printf("foo\n");
unput('\\');
}
bar\\ printf("bar\n");
.
%%
int main() {
yylex();
}
Редактировать 2:
Получил ответ здесь . Используется условие гибкого запуска.
Редактировать 3:
%x backslash
%%
<backslash>foo {
printf("foo\n");
BEGIN(INITIAL);
}
bar\\ {
BEGIN(backslash);
printf("bar\n");
}
.
%%
int main() {
yylex();
}