digit [0-9]
letter [a-zA-Z]
%{
#include <stdio.h>
#include <stdlib.h>
int counter = 0;
%}
/* Rule Section */
/* Token specification */
%%
\"(\\.|[^"\\])*\" {printf("Token: string constant\n"); counter++;}
"int" {printf("Token: int\n"); counter++;}
"float"
{printf
("Token
: float\n"
); counter
++;}"char" {printf("Token: char\n"); counter++;}
"(" {printf("Token: (\n"); counter++;}
")" {printf("Token: )\n"); counter++;}
"{" {printf("Token: {\n"); counter++;}
"}" {printf("Token: }\n"); counter++;}
"#" {printf("Token: #\n"); counter++;}
"<" {printf("Token: <\n"); counter++;}
">" {printf("Token: >\n"); counter++;}
";" {printf("Token: End of Statement\n"); counter++;}
"//".* ;
"stdio.h"|"stdlib.h" {printf("Token:Header file\n"); counter++;}
if
|else
|include|main
|return
|printf
|scanf
|yylex
|yywrap
|yyleng
|yyin
{printf
("Token
: Keyword\n"
); counter
++;}"," {printf("Token: , operator\n"); counter++;}
"=" {printf("Token: assignment operator\n"); counter++;}
"+"|"-"|"*"|"/" {printf("Token: arithmetic operator\n"); counter++;}
{letter}({letter}|{digit})* {printf("Token: identifier\n"); counter++;}
{digit
}+ {printf
("Token
: Integer value\n"
); counter
++;} {digit
}+.{digit
}+ {printf
("Token
: Float value\n"
); counter
++;} .|\n ;
%%
int main()
{
extern FILE *yyin;
char filename[100];
printf
("This Program finds all tokens
!! \n Enter the name of the file to
read:\t"
); scanf("%s", filename);
/* Opening file to read */
yyin = fopen(filename, "r");
if (yyin == NULL){
printf
("Cannot
open file
%s\n", filename); exit(0);
}
/*call the yylex function.*/
yylex();
printf("Token count: %d\n", counter);
return 0;
}
/*call the yywrap function*/
int yywrap()
{
return 1;
}
#include<stdio.h>
int main()
{
printf("Welcome");
return 0;
}
Here, \"(\\.|[^"\\])*\" means
A string consists of a quote mark
"
followed by zero or more of either an escaped anything
\\.
or a non-quote character, non-backslash character
[^"\\]
and finally, a terminating quote
"
Put it all together, and you've got
\"(\\.|[^"\\])*\"