Reputation: 71
This is my lex file
%{
#include<stdio.h>
int codelines = 0;
int commentlines = 0;
int blanklines = 0;
int headerlines = 0;
int brackets = 0;
int keywords = 0;
%}
%%
int|return|char {keywords++}
^[ \t]*\n {blanklines++;}
[ a-zA-Z0-9();]+ {codelines++;}
\{|\} {brackets++;}
#[a-zA-Z0-9<>.]+ {headerlines++;}
\/\/[a-zA-Z0-9 *=]* {commentlines++;}
%%
int main(void) {
yylex();
printf("\n");
printf("Number of Code Lines %d\n", codelines);
printf("Number of Comment Lines %d\n", commentlines);
printf("Number of Blank Lines %d\n", blanklines);
printf("Number of Header Lines %d\n", headerlines);
printf("Number of Braces %d\n", brackets);
printf("Number of Keywords %d\n", keywords);
}
Here is the input file I'm passing to
#include<stdio.h>
int main() {
int a;
int b;
int c;
//My name is Witcher
//Analyzer
return 0;
}
The output is coming like this which is wrong because none of the keywords is detected
Number of Code Lines 8
Number of Comment Lines 2
Number of Blank Lines 0
Number of Header Lines 1
Number of Braces 2
Number of Keywords 0
It should be something like this with the keywords
Number of Code Lines 8
Number of Comment Lines 2
Number of Blank Lines 0
Number of Header Lines 1
Number of Braces 2
Number of Keywords 5
I've tried debugging by adding different statements when keywords should be recognized, but the statement is not run at all
Upvotes: 2
Views: 168
Reputation: 56
What is happening is that lex has 2 important properties here:
Ex: Defining 2 keywords:
<= {printf("Less equal");}
< {printf("Less");}
And giving the input as a<=b
. The output would be Less equal
since <=
is a longer match then simple <
In your code, the codelines regex is matching the words that you want to be matched by keywords regex. As int main(void)
is a valid matching word for codelines regex for example.
You should try to rewrite the codelines regex
Upvotes: 4