#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 является :
([ ])
Примечание: Должно содержать пробел между двумя квадратными скобками.