Какое регулярное выражение для сопоставления пробелов между словами в предложении FLEX?

Я хочу сначала сопоставить пробелы между словами, а затем подсчитать общее количество пробелов в предложении. Я пытаюсь сделать это ниже,

%{
#undef yywrap
#define yywrap() 1
int VowelCount = 0;
int ConsonantCount=0;
int CountWhiteSpace=0;
int CountNewLine=0;
int CountInteger=0;
int CountFloat=0;
%}
%%
[aeiouAEIOU] {++VowelCount;}
[bcdBCDfghFGHjklmnJKLMNpqrstPQRSTvwxyzVWXYZ] {++ConsonantCount;}
[0-9] {++CountInteger;}
[0-9]*[.][0-9]+ {++CountFloat;}
[\s]  {++CountWhiteSpace;}
\n    {++CountNewLine;}
end {return 0;}       
%%
int main(){
yylex();
printf("\nNumber of vowel in the given input  %d\n", VowelCount);
printf("\nNumber of consonant in the given input %d\n",ConsonantCount);
printf("\nNumber of integer in the given input %d\n",CountInteger);
printf("\nNumber of float in the given input %d\n",CountFloat);
printf("\nNumber of line in the given input %d\n",CountNewLine);
printf("\nTotal white space count %d\n",CountWhiteSpace); 
return 0;
}

но я получаю что-то вроде ошибки:

строка 16: Предупреждение, правило не может быть сопоставлено.
Я могу подсчитать гласные, согласные, новую строку, целые числа и числа с плавающей запятой, но мне не хватает пробелов. Я хочу подсчитать пробелы следующим образом:
ввод: Я Ашикур Рахман.
Вывод: 3 // количество пробелов между словами Я, есть, Ашикур, Рахман.
Как я могу добиться этого в ФЛЕКС? Заранее спасибо.


person Ashikur Rahman    schedule 28.05.2021    source источник


Ответы (2)


Если вы просто хотите сопоставить пробел, вы можете использовать " " или [ ]. Но это не эквивалент \s в типичных библиотеках регулярных выражений, который будет соответствовать любому однобайтовому символу пробела, включая табуляции и новые строки. Flex не распознает escape-последовательности, такие как \s, \d или\w, которые могут работать в пакетах регулярных выражений.

У Flex есть два встроенных набора, которые вы можете использовать внутри символьного класса. (Обратите внимание, что внутри класса символов подразумевается, что вам нужно окружить их дополнительными […]):

  • [:space:] означает именно то, что \s: любой пробел, горизонтальный или вертикальный.
  • [:blank:] - это только горизонтальный пробел: пробелы и табуляции.

Вы можете свободно комбинировать их с другими персонажами в классе персонажей. Таким образом, [[:blank:]] будет соответствовать одному символу пробела или табуляции, а [[:space:],;] будет соответствовать любому пробельному символу, а также запятой и точке с запятой.

Часто бывает необходимо сопоставить последовательность пробельных символов, а не только один. В противном случае вы будете неправильно считать слова; the other one имеет четыре пробела, но всего три слова.

Чтобы сопоставить последовательность, используйте один или несколько операторов повторения, +: [[:space:]]+. Это также более эффективно. И это также не мешает вам считать символы, потому что в действии переменная yyleng - это количество символов, совпадающих с шаблоном.

Дополнительную информацию см. В руководстве по Flex.

person rici    schedule 28.05.2021

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

Регулярное выражение для сопоставления пробелов в FLEX:

([ ])

Примечание. Между двумя квадратными скобками должен быть пробел.

person Ashikur Rahman    schedule 28.05.2021