Как использовать REJECT во flex?

Давайте проясним, что я говорю об инструменте лексического анализа.

Для следующего ввода:

aa bb cc dd

Мне нужно, чтобы синтаксический анализатор соответствовал следующим подстрокам:

aa bb

bb cc

cc dd

У меня есть это регулярное выражение:

[a-zA-Z]+[ ]+[a-zA-Z]+

Но это соответствует только:

aa bb

cc dd

Мне сказали, что команду REJECT можно использовать для получения нужного результата, но я не знаю, как ее применить. Может ли кто-нибудь дать мне руку?


person Zeflo    schedule 20.09.2011    source источник
comment
Нет, REJECT в этом случае вам не поможет. Вы захотите, чтобы текущая позиция символа внутри лексера прыгала назад на 2 позиции, когда она соответствует [a-zA-Z]+[ ]+[a-zA-Z]+, в то время как REJECT будет возвращаться к началу правила и пытаться соответствовать гораздо большему количеству. Я недостаточно знаком с Flex, чтобы ответить на ваш вопрос.   -  person Bart Kiers    schedule 20.09.2011


Ответы (2)


Вы можете использовать регулярное выражение для перечисления n и n + 1 пар через весь набор.

Посмотрите на группу с «жадным» обратным (или прямым) совпадением.

person Richard Haven    schedule 20.09.2011
comment
Этот вопрос не о (современных) регулярных выражениях в целом, а о лексическом инструменте GNU-Flex, чьи регулярные выражения действительно являются регулярными (без группировки и всех этих причудливых вещей). - person Bart Kiers; 20.09.2011

Это одно решение Flex для решения проблемы:

    %%
    "aa bb"         {printf( "matched aa bb\n");REJECT;}
    "bb cc"         {printf( "matched bb cc\n");REJECT;}
    "cc dd"         {printf( "matched cc dd\n");REJECT;}
    .               /*ignore anything else*/
    %%
    int main()
    {
    yylex();
    return 0;
    }


When I run the code on your input I get :
matched aa bb
matched bb cc
matched cc dd
person Red Squirrel    schedule 27.09.2011
comment
Но по шаблону, опубликованному OP, [a-zA-Z]+[ ]+[a-zA-Z]+, кажется, что aa bb cc dd - очень упрощенный пример ввода. Я немного знаком с Flex, но я не вижу, чтобы REJECT использовалось более широко. Вы наверное? - person Bart Kiers; 27.09.2011