%{
#undef yywrap
#define yywrap() 1
#include<stdio.h>
int statements = 0;
int ids = 0;
int assign = 0;
int rel = 0;
int keywords = 0;
int integers = 0;
%}
DIGIT [0-9]
LETTER [A-Za-z]
TYPE int|char|bool|float|void|for|do|while|if|else|return|void
%option yylineno
%option noyywrap
%%
\n {statements++;}
{TYPE} {/*printf("%s\n",yytext);*/keywords++;}
(<|>|<=|>=|==) {rel++;}
'#'/[a-zA-Z0-9]* {;}
[a-zA-Z]+[a-zA-Z0-9]* {printf("%s\n",yytext);ids++;}
= {assign++;}
[0-9]+ {integers++;}
. {;}
%%
void main(int argc, char **argv)
{
FILE *fh;
if (argc == 2 && (fh = fopen(argv[1], "r"))) {
yyin = fh;
}
yylex();
printf("statements = %d ids = %d assign = %d rel = %d keywords = %d integers = %d \n",statements,ids,assign,rel,keywords,integers);
}
// Входной file.cLex/сгибать программа для подсчета IdS, утверждения, ключевые слова, операторы и т.д.
#include<stdio.h>
void main(){
float a123;
char a;
char b123;
char c;
int ab[5];
int bc[2];
int ca[7];
int ds[4];
for(a = 0; a < 5 ;a++)
printf("%d ", a);
return 0;
}
выход:
include
stdio
h
main
a123
a
b123
c
ab
bc
ca
ds
a
a
a
printf
d
a
statements = 14 ids = 18 assign = 1 rel = 3 keywords = 11 integers = 7
Я печати идентификаторы на ходу , #include<stdio.h>
подсчитывается как идентификатор. Как мне избежать этого?
Я пробовал '#'/[a-zA-Z0-9]* {;}
правило: действие пара, но оно все еще считается как идентификатор. Как файл символизируется?
Также строка %d
в printf
подсчитывается как идентификатор. Я явно написал, что идентификаторы должны начинаться только с букв, тогда почему %d
определяется как идентификатор?
Директивы препроцессора всегда находятся в одной строке. Директива include начинается с '#' ключевого слова 'include' и строки, представляющей путь, расположенный между угловыми скобками.'% D' в строке анализируется как ' d ', потому что'% 'падает. Содержимое строкового литерала получает синтаксический анализ, потому что вы не обнаруживаете строковые литералы. Строковые литералы - это что-либо между' '' except '' '(кроме if escaped' \ "', но это может быть другое червей). Но вы в последний раз находитесь на хорошем пути. – deamentiaemundi
Итак, как мне избежать «#include» и «% d»? Я получаю 'stdio' и' h' в качестве ключевых слов, как это соответствует определению, которое я дал? Что случилось с «.» Между ними? –
piepi
Вы не можете считать операторы с помощью * lex/flex *. Вам нужно проанализировать это. – EJP