%{
#include <stdio.h>
#include <string.h>
// Define token types for printing
void print_token(const char* type, const char* lexeme) {
printf("Token: %-12s Lexeme: %s\n", type, lexeme);
}
%}
// Define keywords
KEYWORD
(if
|else
|while
|for
|return
|int
|float|char
|double
|void
)
// Define identifier: starts with letter or _, followed by letters, digits, or _
ID [a-zA-Z_][a-zA-Z0-9_]*
// Operators (including multi-char)
OPERATOR (\+\+|--|==|!=|<=|>=|&&|\|\||[+\-*/%=<>!&|])
// Separators
SEPARATOR [\(\)\{\}\[\];,\.]
// Ignore whitespace (spaces, tabs, newlines)
WHITESPACE [ \t\n\r]+
%%
{WHITESPACE} ; // Ignore whitespace characters
{KEYWORD} { print_token("Keyword", yytext); }
{ID} { print_token("Identifier", yytext); }
{NUMBER} { print_token
("Number"
, yytext
); } {OPERATOR} { print_token("Operator", yytext); }
{SEPARATOR} { print_token("Separator", yytext); }
. { printf("Unknown character: %s\n", yytext); }
%%
int main(int argc, char **argv)
{
if (argc > 1) {
FILE *file = fopen(argv[1], "r");
if (!file) {
perror
("Cannot
open file"
); return 1;
}
yyin = file;
}
yylex();
return 0;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCi8vIERlZmluZSB0b2tlbiB0eXBlcyBmb3IgcHJpbnRpbmcKdm9pZCBwcmludF90b2tlbihjb25zdCBjaGFyKiB0eXBlLCBjb25zdCBjaGFyKiBsZXhlbWUpIHsKICAgIHByaW50ZigiVG9rZW46ICUtMTJzIExleGVtZTogJXNcbiIsIHR5cGUsIGxleGVtZSk7Cn0KJX0KCi8vIERlZmluZSBrZXl3b3JkcwpLRVlXT1JEICAgICAoaWZ8ZWxzZXx3aGlsZXxmb3J8cmV0dXJufGludHxmbG9hdHxjaGFyfGRvdWJsZXx2b2lkKQoKLy8gRGVmaW5lIGlkZW50aWZpZXI6IHN0YXJ0cyB3aXRoIGxldHRlciBvciBfLCBmb2xsb3dlZCBieSBsZXR0ZXJzLCBkaWdpdHMsIG9yIF8KSUQgICAgICAgICAgW2EtekEtWl9dW2EtekEtWjAtOV9dKgoKLy8gRGVmaW5lIG51bWJlciAoaW50ZWdlciBvbmx5IGhlcmUpCk5VTUJFUiAgICAgIFswLTldKwoKLy8gT3BlcmF0b3JzIChpbmNsdWRpbmcgbXVsdGktY2hhcikKT1BFUkFUT1IgICAgKFwrXCt8LS18PT18IT18PD18Pj18JiZ8XHxcfHxbK1wtKi8lPTw+ISZ8XSkKCi8vIFNlcGFyYXRvcnMKU0VQQVJBVE9SICAgW1woXClce1x9XFtcXTssXC5dCgovLyBJZ25vcmUgd2hpdGVzcGFjZSAoc3BhY2VzLCB0YWJzLCBuZXdsaW5lcykKV0hJVEVTUEFDRSAgWyBcdFxuXHJdKwoKJSUKCntXSElURVNQQUNFfSAgICA7ICAvLyBJZ25vcmUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCgp7S0VZV09SRH0gICAgICAgeyBwcmludF90b2tlbigiS2V5d29yZCIsIHl5dGV4dCk7IH0Ke0lEfSAgICAgICAgICAgIHsgcHJpbnRfdG9rZW4oIklkZW50aWZpZXIiLCB5eXRleHQpOyB9CntOVU1CRVJ9ICAgICAgICB7IHByaW50X3Rva2VuKCJOdW1iZXIiLCB5eXRleHQpOyB9CntPUEVSQVRPUn0gICAgICB7IHByaW50X3Rva2VuKCJPcGVyYXRvciIsIHl5dGV4dCk7IH0Ke1NFUEFSQVRPUn0gICAgIHsgcHJpbnRfdG9rZW4oIlNlcGFyYXRvciIsIHl5dGV4dCk7IH0KCi4gICAgICAgICAgICAgICB7IHByaW50ZigiVW5rbm93biBjaGFyYWN0ZXI6ICVzXG4iLCB5eXRleHQpOyB9CgolJQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBpZiAoYXJnYyA+IDEpIHsKICAgICAgICBGSUxFICpmaWxlID0gZm9wZW4oYXJndlsxXSwgInIiKTsKICAgICAgICBpZiAoIWZpbGUpIHsKICAgICAgICAgICAgcGVycm9yKCJDYW5ub3Qgb3BlbiBmaWxlIik7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICB5eWluID0gZmlsZTsKICAgIH0KICAgIHl5bGV4KCk7CiAgICByZXR1cm4gMDsKfQo=