lex_by_file( FileName ) :-
get_input_from_file( FileName, TokenList ) ,
lex( TokenList, OutputList ) ,
%write_output( OutputList ), !.
maplist( writeln, OutputList) , ! .
%% atom_number(atom, number)
lex( [ ] , [ ] ) .
lex( [ 'int' | T] , [ 'TYPE: int' | R] ) :- lex( T, R) .
lex( [ 'bool' | T] , [ 'TYPE: bool' ] | R) :- lex( T, R) .
lex( [ ',' | T] , [ 'COMMA: ,' ] | R) :- lex( T, R) .
lex( [ X | T] , [ X | R] ) :- lex( T, R) .
%{
/* program to recognize a C program */
#include < stdio. h>
#include < stdlib. h>
int COMMENT = 0 ;
%}
identifier [ a- zA- Z] [ a- zA- Z0- 9 ] *
%%
#. * { printf( "\n%s is a PREPROCESSOR DIRECTIVE", yytext); }
int
| float | char
| double
| while
| for
| do
| if
| break
| continue
| void
| switch
| case
| long
| struct
| const
| typedef
| return
| else
| goto
{ printf
( "\n\t
%s is a KEYWORD", yytext); } "/*" { COMMENT = 1; }
"*/ " { COMMENT = 0 ; }
{ identifier} \( { if ( ! COMMENT) printf( "\n\nFUNCTION\n\t%s", yytext); }
{ { if ( ! COMMENT) printf( "\n BLOCK BEGINS") ; } }
} { if ( ! COMMENT) printf( "\n BLOCK ENDS") ; }
{ identifier} ( \[ [ 0 - 9 ] * \] ) ? { if ( ! COMMENT) printf( "\n %s IDENTIFIER", yytext); }
\". * \" { if ( ! COMMENT) printf( "\n\t%s is a STRING", yytext); }
[ 0 - 9 ] + { if ( ! COMMENT) printf( "\n\t%s is a NUMBER", yytext); }
. { if ( ! COMMENT) printf( "\n\t%s is an UNKNOWN CHARACTER", yytext); }
<= | >= | < | == | > { if ( ! COMMENT) printf( "\n\t%s is a RELATIONAL OPERATOR", yytext); }
= { if ( ! COMMENT) printf( "\n\t%s is an ASSIGNMENT OPERATOR", yytext); }
%%
int main( int argc, char ** argv) {
if ( argc > 1 ) {
FILE * file;
file = fopen( argv[ 1 ] , "r") ;
if ( ! file) {
printf
( "could not
open %s \n", argv[1]); exit( 0 ) ;
}
yyin = file;
}
yylex( ) ;
printf( "\n\n") ;
return 0 ;
}
int yywrap( ) {
return 1 ;
}
bGV4X2J5X2ZpbGUoIEZpbGVOYW1lICkgOi0KCWdldF9pbnB1dF9mcm9tX2ZpbGUoIEZpbGVOYW1lLCBUb2tlbkxpc3QgKSwKCWxleCggVG9rZW5MaXN0LCBPdXRwdXRMaXN0ICksCgkld3JpdGVfb3V0cHV0KCBPdXRwdXRMaXN0ICksICEuCgltYXBsaXN0KHdyaXRlbG4sT3V0cHV0TGlzdCksIS4KCiUlIGF0b21fbnVtYmVyKGF0b20sIG51bWJlcikKbGV4KFtdLFtdKS4KbGV4KFsnaW50JyB8IFRdLCBbJ1RZUEU6IGludCcgfCBSXSkgOi0gIGxleChULCBSKS4KbGV4KFsnYm9vbCcgfCBUXSwgWydUWVBFOiBib29sJ10gfCBSKSA6LSBsZXgoVCwgUikuCmxleChbJywnIHwgVF0sIFsnQ09NTUE6ICwnXSB8IFIpIDotIGxleChULCBSKS4KbGV4KFtYIHwgVF0sIFtYIHwgUl0pIDotIGxleChULCBSKS4KCgoKJXsKLyogcHJvZ3JhbSB0byByZWNvZ25pemUgYSBDIHByb2dyYW0gKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmludCBDT01NRU5UID0gMDsKJX0KCmlkZW50aWZpZXIgW2EtekEtWl1bYS16QS1aMC05XSoKJSUKIy4qIHsgcHJpbnRmKCJcbiVzIGlzIGEgUFJFUFJPQ0VTU09SIERJUkVDVElWRSIsIHl5dGV4dCk7IH0KaW50IHwgZmxvYXQgfCBjaGFyIHwgZG91YmxlIHwgd2hpbGUgfCBmb3IgfCBkbyB8IGlmIHwgYnJlYWsgfCBjb250aW51ZSB8IHZvaWQgfCBzd2l0Y2ggfCBjYXNlIHwgbG9uZyB8IHN0cnVjdCB8IGNvbnN0IHwgdHlwZWRlZiB8IHJldHVybiB8IGVsc2UgfCBnb3RvIHsgcHJpbnRmKCJcblx0JXMgaXMgYSBLRVlXT1JEIiwgeXl0ZXh0KTsgfQoiLyoiIHsgQ09NTUVOVCA9IDE7IH0KIiovIiB7IENPTU1FTlQgPSAwOyB9CntpZGVudGlmaWVyfVwoIHsgaWYgKCFDT01NRU5UKSBwcmludGYoIlxuXG5GVU5DVElPTlxuXHQlcyIsIHl5dGV4dCk7IH0KeyB7IGlmICghQ09NTUVOVCkgcHJpbnRmKCJcbiBCTE9DSyBCRUdJTlMiKTsgfSB9Cn0geyBpZiAoIUNPTU1FTlQpIHByaW50ZigiXG4gQkxPQ0sgRU5EUyIpOyB9CntpZGVudGlmaWVyfShcW1swLTldKlxdKT8geyBpZiAoIUNPTU1FTlQpIHByaW50ZigiXG4gJXMgSURFTlRJRklFUiIsIHl5dGV4dCk7IH0KXCIuKlwiIHsgaWYgKCFDT01NRU5UKSBwcmludGYoIlxuXHQlcyBpcyBhIFNUUklORyIsIHl5dGV4dCk7IH0KWzAtOV0rIHsgaWYgKCFDT01NRU5UKSBwcmludGYoIlxuXHQlcyBpcyBhIE5VTUJFUiIsIHl5dGV4dCk7IH0KLiB7IGlmICghQ09NTUVOVCkgcHJpbnRmKCJcblx0JXMgaXMgYW4gVU5LTk9XTiBDSEFSQUNURVIiLCB5eXRleHQpOyB9Cjw9IHwgPj0gfCA8IHwgPT0gfCA+IHsgaWYgKCFDT01NRU5UKSBwcmludGYoIlxuXHQlcyBpcyBhIFJFTEFUSU9OQUwgT1BFUkFUT1IiLCB5eXRleHQpOyB9Cj0geyBpZiAoIUNPTU1FTlQpIHByaW50ZigiXG5cdCVzIGlzIGFuIEFTU0lHTk1FTlQgT1BFUkFUT1IiLCB5eXRleHQpOyB9CiUlIAoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBpZiAoYXJnYyA+IDEpIHsgCiAgICAgICAgRklMRSAqZmlsZTsKICAgICAgICBmaWxlID0gZm9wZW4oYXJndlsxXSwgInIiKTsKICAgICAgICBpZiAoIWZpbGUpIHsKICAgICAgICAgICAgcHJpbnRmKCJjb3VsZCBub3Qgb3BlbiAlcyBcbiIsIGFyZ3ZbMV0pOyAKICAgICAgICAgICAgZXhpdCgwKTsKICAgICAgICB9CiAgICAgICAgeXlpbiA9IGZpbGU7CiAgICB9CiAgICB5eWxleCgpOyAKICAgIHByaW50ZigiXG5cbiIpOyAKICAgIHJldHVybiAwOwp9IAoKaW50IHl5d3JhcCgpIHsgCiAgICByZXR1cm4gMTsgCn0=