Как заставить Flex соответствовать регулярному выражению максимум один раз за слово - PullRequest
0 голосов
/ 17 октября 2018

Я новичок в сгибании и немного с ним играюсь.Задача, которую сейчас пытаются решить, - выяснить, сколько из следующих 18 строк: pVV pVV pppVVV pppV pppVVV ppV pVVV pV pppVV pV ppVVV ppVV pVVV ppVV ppVVV pVV pppVVV pppVVV совпадают, по крайней мере, один раз, по крайней мере один раз,регулярное выражение: (ppp | VV)

У меня есть следующий код, но он дает мне общее количество совпадений и двойное число определенных строк.Как бы я изменил этот код так, чтобы он соответствовал слову максимум один раз?Заранее спасибо!

%{
    #include <stdlib.h>
    #include <stdio.h>  
    int matches = 0;
%}

%%      
(ppp|VV)    {   matches++; }
%%

int main()
{
    yylex();
    printf("%d\n", matches);
    return 0;
}

1 Ответ

0 голосов
/ 18 октября 2018

Flex - это инструмент для анализа входного потока в токены.

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

Я думаю, что вы пытаетесь здесь сделать, это разделить входной поток на токены и затем классифицироватьжетоны.Для этого можно использовать Flex, но вы должны четко понимать, что такое токен.Вы также должны помнить, что весь поток ввода должен быть обработан;Вы не можете просто выполнить поиск по регулярному выражению во входном потоке для того, что вас интересует. Все - даже пробел - должен быть частью некоторого токена.

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

  • "слов"
  • всего остального.

Однако вы не говорите, что считаете нужным«Слово», чтобы быть.Можно предположить, что слово - это любая последовательность непробельных символов, но у вас может быть более ограниченное определение.(Возможно, вы имеете в виду только буквы и цифры. Или даже просто буквы. Или, возможно, некоторые знаки препинания должны быть разрешены).

Из «слов» вас интересуют, какие из содержат последовательности ppp или VV.Таким образом, вы получаете три вида токенов:

  • все, что не является словом
  • "слова", которые содержат ppp или VV
  • любойдругие «слова».

Предполагая, что вы действительно имели в виду, что «слово» - это любая последовательность непробельных символов, эта категоризация может быть выполнена с помощью следующего простого набора шаблонов сгибания:

[[:space:]]+                        ; /* Ignore whitespace */
[^[:space:]]*(ppp|VV)[^[:space:]]*  { matches++; }
[^[:space:]]+                       ; /* Ignore other words */

Обратите внимание, что вышесказанное полностью зависит от того, как вы определяете «слово», которое вы еще не сделали (по крайней мере, не в вашем вопросе).Таким образом, он может иметь лишь небольшое сходство с вашей реальной проблемой, но его легко адаптировать.

Чтобы получить полное описание синтаксиса регулярного выражения, прочитайте руководство flex .Синтаксис должен быть знаком, но это не то же самое, что любая библиотека регулярных выражений, и вы обнаружите, что большинство онлайн-инструментов регулярных выражений не понимают синтаксис Flex.

...