Подсчитав количество символов в комментарии, Лекс - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть кодирование для подсчета количества комментариев, строк, символов, ключевых слов и чисел в файле с помощью lex.Я считаю, что у меня есть счетчик строк, счетчик ключевых слов, счетчик чисел и счетчик комментариев, но мой счетчик символов немного запутался.

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

Любая помощь будет оценена.Вот мой код:

 %option noyywrap
 %{
 #include <stdio.h>
 #include <math.h>
 int charno=0;
 int lineno=0;
 int numno=0;
 int keyno=0;
 int comno=0;
 %}

 character [a-zA-Z]
 line [\n]
 digit [0-9]
 keyword if|else|while|return
 s_comment "{"[^}\n]*"}"
 l_comment "/*"([^*]|\*+[^*/])*\*+"/"


 %%
 {s_comment}     {
                    comno++;
                 }
 {digit}         {
                    charno++;
                 }
 {l_comment}     {
                    comno++;
                    lineno++;
                 }
 {digit}*        {
                    numno++;
                 }

 {character}     {
                    charno++;
                 }
 {line}          {
                    lineno++;
                 }
 .               {
                    charno++;
                 }
 {keyword}       {
                    keyno++;
                 }
 %%
 int main(int argc, char **argv)
 {
            ++argv, --argc; /*skip over program name */
            if (argc > 0)
                    yyin = fopen(argv[0], "r");
            else
                    yyin = stdin;
            yylex();

            printf("Number of characters: %d\n", charno);
            printf("Number of lines:      %d\n", lineno);
            printf("Number of keywords:   %d\n", keyno);
            printf("Number of numbers:    %d\n", numno);
            printf("Number of comments:   %d\n", comno);
            return 0;
 }

При запуске с этим:

 /*this is a comment 1*/
 /*comment
   comment 2 
 */
 /*comment 3*
*/if this is a line
{this is a test comment 4}
int i = 101; 
int j = 202;
if i == 303 then
 {this is a test comment 5}
else
{Should have 3 keywords}
{Should have 3 numbers}
/*Should have 8 comments including
 *this one*/ 
end

Это должно привести к:

Number of characters:296
Number of lines: 17
Number of keywords: 3
Number of numbers: 3
Number of comments: 8

Но вместо этогопроизводит:

Number of characters:52
Number of lines: 17
Number of keywords: 3
Number of numbers: 3
Number of comments: 8
...