Flex: соответствует, если ему предшествует символ / шаблон - PullRequest
0 голосов
/ 30 января 2020

Как сопоставить шаблон 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();
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...