%{
#include <stdio.h>
#include <stdlib.h>
int yylineno = 1;
FILE *yyin;
%}
letter [a-zA-Z]
digit [0-9]
%%
\n { yylineno++; }
"#include<"{letter}+(\.{letter}+)?">"
{ printf("%d\t%s\tPREPROCESSOR\n", yylineno, yytext); }
[ \t]+ ; /* Ignore spaces and tabs */
(return|main|for|while|case|switch|if|else)
{ printf("%d\t%s\tKEYWORD\n", yylineno, yytext); }
{ printf("%d\t%s\tDATATYPE\n", yylineno, yytext); }
"(" { printf("%d\t%s\tBRACKET OPEN\n", yylineno, yytext); }
")" { printf("%d\t%s\tBRACKET CLOSE\n", yylineno, yytext); }
"{" { printf("%d\t%s\tBRACE OPEN\n", yylineno, yytext); }
"}" { printf("%d\t%s\tBRACE CLOSE\n", yylineno, yytext); }
{letter}({letter}|{digit})*
{ printf("%d\t%s\tIDENTIFIER\n", yylineno, yytext); }
{digit}+
{ printf("%d\t%s\tINTEGER\n", yylineno, yytext); }
{digit}+"E"(\+|\-)?{digit}+
{ printf("%d\t%s\tREAL NUMBER\n", yylineno, yytext); }
{digit}+\.{digit}+(E(\+|\-)?{digit}+)?
{ printf("%d\t%s\tFLOATING NUMBER\n", yylineno, yytext); }
"=" { printf("%d\t%s\tASSIGNMENT\n", yylineno, yytext); }
";" { printf("%d\t%s\tTERMINATOR\n", yylineno, yytext); }
\"({letter}|{digit}|[ ])*\"
{ printf("%d\t%s\tSTRING CONSTANT\n", yylineno, yytext); }
. ; /* Ignore other characters */
%%
int yywrap()
{
return 1;
}
int main(int argc, char *argv[])
{
if(argc < 2)
{
printf("Usage: %s <inputfile>\n", argv[0]);
return 1;
}
yyin = fopen(argv[1], "r");
if(yyin == NULL)
{
printf
("Cannot
open file\n"
); return 1;
}
printf("LINE\tLEXEME\tTOKEN\n");
yylex();
fclose(yyin);
return 0;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmludCB5eWxpbmVubyA9IDE7CkZJTEUgKnl5aW47CiV9CgpsZXR0ZXIgIFthLXpBLVpdCmRpZ2l0ICAgWzAtOV0KCiUlCgpcbiAgICAgIHsgeXlsaW5lbm8rKzsgfQoKIiNpbmNsdWRlPCJ7bGV0dGVyfSsoXC57bGV0dGVyfSspPyI+IiAKICAgICAgICB7IHByaW50ZigiJWRcdCVzXHRQUkVQUk9DRVNTT1JcbiIsIHl5bGluZW5vLCB5eXRleHQpOyB9CgpbIFx0XSsgIDsgICAvKiBJZ25vcmUgc3BhY2VzIGFuZCB0YWJzICovCgoocmV0dXJufG1haW58Zm9yfHdoaWxlfGNhc2V8c3dpdGNofGlmfGVsc2UpCiAgICAgICAgeyBwcmludGYoIiVkXHQlc1x0S0VZV09SRFxuIiwgeXlsaW5lbm8sIHl5dGV4dCk7IH0KCihpbnR8ZmxvYXR8Y2hhcnxzdHJ1Y3QpCiAgICAgICAgeyBwcmludGYoIiVkXHQlc1x0REFUQVRZUEVcbiIsIHl5bGluZW5vLCB5eXRleHQpOyB9CgoiKCIgICAgIHsgcHJpbnRmKCIlZFx0JXNcdEJSQUNLRVQgT1BFTlxuIiwgeXlsaW5lbm8sIHl5dGV4dCk7IH0KCiIpIiAgICAgeyBwcmludGYoIiVkXHQlc1x0QlJBQ0tFVCBDTE9TRVxuIiwgeXlsaW5lbm8sIHl5dGV4dCk7IH0KCiJ7IiAgICAgeyBwcmludGYoIiVkXHQlc1x0QlJBQ0UgT1BFTlxuIiwgeXlsaW5lbm8sIHl5dGV4dCk7IH0KCiJ9IiAgICAgeyBwcmludGYoIiVkXHQlc1x0QlJBQ0UgQ0xPU0VcbiIsIHl5bGluZW5vLCB5eXRleHQpOyB9Cgp7bGV0dGVyfSh7bGV0dGVyfXx7ZGlnaXR9KSoKICAgICAgICB7IHByaW50ZigiJWRcdCVzXHRJREVOVElGSUVSXG4iLCB5eWxpbmVubywgeXl0ZXh0KTsgfQoKe2RpZ2l0fSsgCiAgICAgICAgeyBwcmludGYoIiVkXHQlc1x0SU5URUdFUlxuIiwgeXlsaW5lbm8sIHl5dGV4dCk7IH0KCntkaWdpdH0rIkUiKFwrfFwtKT97ZGlnaXR9KwogICAgICAgIHsgcHJpbnRmKCIlZFx0JXNcdFJFQUwgTlVNQkVSXG4iLCB5eWxpbmVubywgeXl0ZXh0KTsgfQoKe2RpZ2l0fStcLntkaWdpdH0rKEUoXCt8XC0pP3tkaWdpdH0rKT8KICAgICAgICB7IHByaW50ZigiJWRcdCVzXHRGTE9BVElORyBOVU1CRVJcbiIsIHl5bGluZW5vLCB5eXRleHQpOyB9CgoiPSIgICAgIHsgcHJpbnRmKCIlZFx0JXNcdEFTU0lHTk1FTlRcbiIsIHl5bGluZW5vLCB5eXRleHQpOyB9CgoiOyIgICAgIHsgcHJpbnRmKCIlZFx0JXNcdFRFUk1JTkFUT1JcbiIsIHl5bGluZW5vLCB5eXRleHQpOyB9CgpcIih7bGV0dGVyfXx7ZGlnaXR9fFsgXSkqXCIKICAgICAgICB7IHByaW50ZigiJWRcdCVzXHRTVFJJTkcgQ09OU1RBTlRcbiIsIHl5bGluZW5vLCB5eXRleHQpOyB9CgouICAgICAgIDsgICAvKiBJZ25vcmUgb3RoZXIgY2hhcmFjdGVycyAqLwoKJSUKCmludCB5eXdyYXAoKQp7CiAgICByZXR1cm4gMTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgaWYoYXJnYyA8IDIpCiAgICB7CiAgICAgICAgcHJpbnRmKCJVc2FnZTogJXMgPGlucHV0ZmlsZT5cbiIsIGFyZ3ZbMF0pOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHl5aW4gPSBmb3Blbihhcmd2WzFdLCAiciIpOwoKICAgIGlmKHl5aW4gPT0gTlVMTCkKICAgIHsKICAgICAgICBwcmludGYoIkNhbm5vdCBvcGVuIGZpbGVcbiIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHByaW50ZigiTElORVx0TEVYRU1FXHRUT0tFTlxuIik7CgogICAgeXlsZXgoKTsKCiAgICBmY2xvc2UoeXlpbik7CiAgICByZXR1cm4gMDsKfQ==