У меня есть кодирование для подсчета количества комментариев, строк, символов, ключевых слов и чисел в файле с помощью 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