%{ #include #include #define FDEFN 257 #define FCALL 258 int fdefn = 0, fcall = 0, lineno = 1; char *lexeme; %} whitespace [ \t]+ optwhitespace [ \t]* validname [a-zA-Z_][a-zA-Z0-9_]* invalidname (if|for|while|switch|return) invalidtype (else|do) leftparen {optwhitespace}\( ftypename {validname}{whitespace}\*?{optwhitespace}{validname} %% {invalidtype}{whitespace}{invalidname}/{leftparen} { } {invalidtype}{whitespace}{validname}/{leftparen} { lexeme = yytext; while ((*lexeme != ' ') && (*lexeme != '\t')) ++lexeme; while ((*lexeme == ' ') || (*lexeme == '\t')) ++lexeme; return FCALL; } {ftypename}/{leftparen} { lexeme = yytext; return FDEFN; } {invalidname}/{leftparen} { } {validname}/{leftparen} { lexeme = yytext; return FCALL; } \n { ++lineno; } . { } %% int yywrap () { return 1; } int main ( int argc, char *argv[] ) { int nexttoken; if (argc > 1) yyin = (FILE *)fopen(argv[1],"r"); while ((nexttoken = yylex())) { switch (nexttoken) { case FCALL: printf("\t\tFunction call at line %d: \"%s\"\n", lineno, lexeme); ++fcall; break; case FDEFN: printf("\tFunction definition at line %d: \"%s\"\n", lineno, lexeme); ++fdefn; break; } } fclose(yyin); printf("+++ %d function definitions found\n", fdefn); printf("+++ %d function calls found\n", fcall); exit(0); }