Lex: сопоставить несколько регулярных выражений одновременно - PullRequest
1 голос
/ 18 февраля 2020

У меня есть код ниже: я хочу посчитать количество символов, используя

(.)   {charCount++;}

, и в то же время подсчитать количество слов, используя

([a-zA-Z0-9])*    {wordcount++;}

, возможно ли это используя правила lex, или я должен считать это «вручную / программно», используя поток файлов в коде c. В основном есть код для "продолжить сопоставление / регулярное выражение"

%% 
[\t ]+  ; //ignore white space
"\n" ;  //ignore next line // 
([a-zA-Z0-9])*    {wordcount++;}
(.)   {charCount++;}
%% 
int yywrap(void){} 
int main() 
{    
    // The function that starts the analysis 
    yyin=fopen("input.txt", "r");
    yylex(); 
    printf("The number of words in the file is %d and charCount %d",count,wordSize);
    return 0; 
}

1 Ответ

2 голосов
/ 18 февраля 2020

Количество символов, соответствующих правилу, доступно в yyleng, поэтому вы можете сделать это:

[ \t\n]         ;
[a-zA-Z0-9]+    { ++wordcount; charcount += yyleng; }
.               { ++charcount; }

Но (f) lex не предназначен для многократного сканирования ввода. Так что нет простого общего решения.

FWIW, я бы использовал [[:alnum:]] вместо [a-zA-Z0-9] и [[:space:]] вместо [ \t\n].

...