%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
%}
identifier [a-zA-Z_][a-zA-Z0-9_]*
operator [+\-*/%=><!&|~^?]
invalid [0-9][a-zA-Z]*
%%
"auto" { printf("KEYWORD = auto\n"); }
"break" { printf("KEYWORD = break\n"); }
"case" { printf("KEYWORD = case\n"); }
"char" { printf("KEYWORD = char\n"); }
"const" { printf("KEYWORD = const\n"); }
"continue" { printf("KEYWORD = continue\n"); }
"default" { printf("KEYWORD = default\n"); }
"do" { printf("KEYWORD = do\n"); }
"double" { printf("KEYWORD = double\n"); }
"else" { printf("KEYWORD = else\n"); }
"enum" { printf("KEYWORD = enum\n"); }
"extern" { printf("KEYWORD = extern\n"); }
"float"
{ printf
("KEYWORD
= float\n"
); }"for" { printf("KEYWORD = for\n"); }
"goto" { printf("KEYWORD = goto\n"); }
"if" { printf("KEYWORD = if\n"); }
"int" { printf("KEYWORD = int\n"); }
"long" { printf("KEYWORD = long\n"); }
"register" { printf("KEYWORD = register\n"); }
"return" { printf("KEYWORD = return\n"); }
"short" { printf("KEYWORD = short\n"); }
"signed" { printf("KEYWORD = signed\n"); }
"sizeof" { printf("KEYWORD = sizeof\n"); }
"static" { printf("KEYWORD = static\n"); }
"struct" { printf("KEYWORD = struct\n"); }
"switch" { printf("KEYWORD = switch\n"); }
"typedef" { printf("KEYWORD = typedef\n"); }
"union" { printf("KEYWORD = union\n"); }
"unsigned" { printf("KEYWORD = unsigned\n"); }
"void" { printf("KEYWORD = void\n"); }
"volatile" { printf("KEYWORD = volatile\n"); }
"while" { printf("KEYWORD = while\n"); }
{identifier} { printf("IDENTIFIER => %s\n", yytext); }
{operator} { printf("OPERATOR => %s\n", yytext); }
#.* { printf("PRE PROCESSOR DIRECTIVE => %c", yytext);}
[ \t\n] { }
{invalid} { fprintf(stderr, "INVALID => %c\n", yytext[0]); }
%%
int main() {
char buffer[1024];
printf("\n\tLEXICAL ANALYZER PROGRAM\n");
printf("INPUT:\n");
while (fgets(buffer, sizeof(buffer), stdin)) {
if (strlen(buffer) == 1 && buffer[0] == '\n') {
break;
}
yy_scan_string(buffer);
yylex();
yy_flush_buffer(YY_CURRENT_BUFFER);
}
return 0;
}
int yywrap(){
return 0;
}