Как я могу использовать проверки назад в lex?

Мне нужны положительные проверки назад в lex (flex 2.5.35). Изучив документацию, я не вижу прямого способа сделать это. Он имеет что-то похожее на утверждение просмотра вперед (синтаксис r/s), но не просмотр назад. Как лучше всего добиться такого же эффекта?

Вот пример: Скажем, у меня есть следующие правила в моем файле спецификации сканера:

a         printf("matched a ");
b         printf("matched b ");
c         printf("matched c ");
d         printf("matched d ");

Как мне сопоставить «d» после «b» и самого «b», чтобы при вводе «abd» я получил:

matched a matched b matched d following b

Но для строки «acd»

matched a matched c matched d

Правило:

bd        printf("matched d following b ");

очевидно, не работает, так как он потребляет b; для 'abd' он выводит:

matched a matched d following b

Если бы у меня был pcre lookbehinds, я мог бы написать:

(?<=b)d   printf("matched d following b ");

и все бы ничего, но lex этого не поддерживает.


person justinrstout    schedule 10.04.2011    source источник


Ответы (3)


Вероятно, вы сможете добиться желаемого с помощью начальных условий за счет более сложного сканера. Начальные условия позволяют условно включать правила на основе того, что совпало ранее. Вот пример:

%x matched_b
%%
<INITIAL,matched_b>{
    a       { printf("matched a\n"); BEGIN(INITIAL); }
    b       { printf("matched b\n"); BEGIN(matched_b); }
    c       { printf("matched c\n"); BEGIN(INITIAL); }
}

d       printf("matched d\n");
<matched_b>d    { printf("matched d following b\n"); BEGIN(INITIAL); }

С этим сканером я получаю:

$ echo abcd | ./5615080
matched a
matched b
matched c
matched d

$ echo abdd | ./5615080
matched a
matched b
matched d following b
matched d
person Andy    schedule 11.04.2011
comment
Хм. Это выглядит довольно сложно, но я думаю, что другого пути нет. Спасибо за вашу помощь. - person justinrstout; 12.04.2011

Я могу думать о двух возможностях, если у вас есть только предварительное утверждение.

  1. Инвертируйте свою строку и найдите также инвертированный шаблон. То, что обычно было до вашего паттерна, теперь опережает его.

  2. Я думаю, что для некоторых разновидностей регулярных выражений можно анализировать справа налево, возможно, это может помочь вам вместе с вашим взглядом вперед.

В противном случае вам следует опубликовать несколько примеров строк и то, что вы ожидаете в результате, возможно, это может быть достигнуто без использования проверок позади утверждений.

person stema    schedule 11.04.2011

Синтаксис pcre выглядит следующим образом:

(?<= ... ) положительное
(?<! ... ) отрицательное

А для pcre требуется просмотр фиксированной длины (положительный или отрицательный).

Если они есть у lex, то, вероятно, именно такой формы.

person Community    schedule 11.04.2011
comment
Flex в настоящее время не поддерживает их. Источник: http://web.archive.org/web/20160525061545/http://flex.sourceforge.net:80/manual/Patterns.html - person starbeamrainbowlabs; 30.10.2017