este es mi archivo lex
%{ #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); }Aquí está el archivo de entrada al que estoy pasando
#include<stdio.h> int main() { int a; int b; int c; //My name is Witcher //Analyzer return 0; }El resultado viene así, lo cual es incorrecto porque no se detecta ninguna de las palabras clave
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 0Debería ser algo como esto con las palabras clave
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 5Intenté depurar agregando diferentes declaraciones cuando se deben reconocer las palabras clave, pero la declaración no se ejecuta en absoluto
Lo que sucede es que lex tiene 2 propiedades importantes aquí:
Ej: Definición de 2 palabras clave:
<= {printf("Less equal");}
< {printf("Less");}
Y dando la entrada como a<=b . La salida sería Less equal ya que <= es una coincidencia más larga que simple <
En su código, la expresión regular de líneas de código coincide con las palabras que desea que coincidan con las expresiones regulares de palabras clave. Como int main(void) es una palabra de coincidencia válida para expresiones regulares de líneas de código, por ejemplo.
Deberías intentar reescribir las líneas de código regex