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

#regex #flex-lexer #lexical-analysis

Вопрос:

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

 %{
#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  %dn", VowelCount);
printf("nNumber of consonant in the given input %dn",ConsonantCount);
printf("nNumber of integer in the given input %dn",CountInteger);
printf("nNumber of float in the given input %dn",CountFloat);
printf("nNumber of line in the given input %dn",CountNewLine);
printf("nTotal white space count %dn",CountWhiteSpace); 
return 0;
}
 

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

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

Ответ №1:

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

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

  • [:space:] означает именно то, что s означало бы: любой символ пробела, горизонтальный или вертикальный.
  • [:blank:] есть только горизонтальные пробелы: пробелы и вкладки.

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

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

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

Для получения дополнительной информации см. Руководство по гибкому трубопроводу.

Ответ №2:

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

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

 ([ ])
 

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