%{
int COMMENT = 0 ; // Flag to track if inside a comment
%}
identifier [ a- zA- Z] [ a- zA- Z0- 9 ] * // Regular expression for identifiers
%%
#. * {
// Matches preprocessor directives
printf( "\n%s is a preprocessor directive", yytext);
}
int |
char |
double |
while |
for |
struct |
typedef |
do |
if |
break |
continue |
void |
switch |
return |
else |
goto {
// Matches keywords
printf( "\n\t%s is a keyword", yytext);
}
"/*" {
// Start of a comment
COMMENT = 1;
printf("\n\t%s is a COMMENT", yytext);
}
"*/ " {
// End of a comment
COMMENT = 0 ;
printf( "\n\t%s is a COMMENT END", yytext);
}
{ identifier} \( {
// Function definition ( identifier followed by '(' )
if ( ! COMMENT) {
printf( "\nFUNCTION \n\t%s", yytext);
}
}
\{ {
// Block starts
if ( ! COMMENT) {
printf( "\n BLOCK BEGINS") ;
}
}
\} {
// Block ends
if ( ! COMMENT) {
printf( "BLOCK ENDS ") ;
}
}
{ identifier} ( \[ [ 0 - 9 ] * \] ) ? {
// Identifiers, with optional array index
if ( ! COMMENT) {
printf( "\n %s IDENTIFIER", yytext);
}
}
\"[ ^\"] * \" {
// Strings, allows escape sequences ( not yet fully handling all escape sequences)
if ( ! COMMENT) {
printf( "\n\t %s is a STRING", yytext);
}
}
[ 0 - 9 ] + {
// Numbers
if ( ! COMMENT) {
printf( "\n %s is a NUMBER ", yytext);
}
}
\) ( \: ) ? {
// Matches ')' followed by an optional ':'
if ( ! COMMENT) {
printf( "\n\t") ;
}
ECHO; // Print the token
printf( "\n") ;
}
\( {
// Matches opening '('
ECHO;
}
= {
// Assignment operator '='
if ( ! COMMENT) {
printf( "\n\t %s is an ASSIGNMENT OPERATOR", yytext);
}
}
\<= |
\>= |
\< |
== |
\> |
! = {
// Relational operators
if ( ! COMMENT) {
printf( "\n\t%s is a RELATIONAL OPERATOR", yytext);
}
}
%%
int main( int argc, char ** argv) {
FILE * file;
file
= fopen
( "
var . c"
, "r"
) ;
if ( ! file) {
printf
( "could not
open the file"
) ; exit( 0 ) ;
}
yyin = file; // Use file input
yylex( ) ; // Start lexical analysis
printf( "\n") ;
return( 0 ) ;
}
int yywrap( ) {
return( 1 ) ; // End of input
}
JXsKaW50IENPTU1FTlQgPSAwOyAvLyBGbGFnIHRvIHRyYWNrIGlmIGluc2lkZSBhIGNvbW1lbnQKJX0KCmlkZW50aWZpZXIgW2EtekEtWl1bYS16QS1aMC05XSogLy8gUmVndWxhciBleHByZXNzaW9uIGZvciBpZGVudGlmaWVycwoKJSUKCiMuKiB7CiAgICAvLyBNYXRjaGVzIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzCiAgICBwcmludGYoIlxuJXMgaXMgYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIiwgeXl0ZXh0KTsKfQoKaW50IHwKZmxvYXQgfApjaGFyIHwKZG91YmxlIHwKd2hpbGUgfApmb3IgfApzdHJ1Y3QgfAp0eXBlZGVmIHwKZG8gfAppZiB8CmJyZWFrIHwKY29udGludWUgfAp2b2lkIHwKc3dpdGNoIHwKcmV0dXJuIHwKZWxzZSB8CmdvdG8gewogICAgLy8gTWF0Y2hlcyBrZXl3b3JkcwogICAgcHJpbnRmKCJcblx0JXMgaXMgYSBrZXl3b3JkIiwgeXl0ZXh0KTsKfQoKIi8qIiB7CiAgICAvLyBTdGFydCBvZiBhIGNvbW1lbnQKICAgIENPTU1FTlQgPSAxOwogICAgcHJpbnRmKCJcblx0JXMgaXMgYSBDT01NRU5UIiwgeXl0ZXh0KTsKfQoKIiovIiB7CiAgICAvLyBFbmQgb2YgYSBjb21tZW50CiAgICBDT01NRU5UID0gMDsKICAgIHByaW50ZigiXG5cdCVzIGlzIGEgQ09NTUVOVCBFTkQiLCB5eXRleHQpOwp9Cgp7aWRlbnRpZmllcn1cKCB7CiAgICAvLyBGdW5jdGlvbiBkZWZpbml0aW9uIChpZGVudGlmaWVyIGZvbGxvd2VkIGJ5ICcoJykKICAgIGlmICghQ09NTUVOVCkgewogICAgICAgIHByaW50ZigiXG5GVU5DVElPTiBcblx0JXMiLCB5eXRleHQpOwogICAgfQp9CgpceyB7CiAgICAvLyBCbG9jayBzdGFydHMKICAgIGlmICghQ09NTUVOVCkgewogICAgICAgIHByaW50ZigiXG4gQkxPQ0sgQkVHSU5TIik7CiAgICB9Cn0KClx9IHsKICAgIC8vIEJsb2NrIGVuZHMKICAgIGlmICghQ09NTUVOVCkgewogICAgICAgIHByaW50ZigiQkxPQ0sgRU5EUyAiKTsKICAgIH0KfQoKe2lkZW50aWZpZXJ9KFxbWzAtOV0qXF0pPyB7CiAgICAvLyBJZGVudGlmaWVycywgd2l0aCBvcHRpb25hbCBhcnJheSBpbmRleAogICAgaWYgKCFDT01NRU5UKSB7CiAgICAgICAgcHJpbnRmKCJcbiAlcyBJREVOVElGSUVSIiwgeXl0ZXh0KTsKICAgIH0KfQoKXCJbXlwiXSpcIiB7CiAgICAvLyBTdHJpbmdzLCBhbGxvd3MgZXNjYXBlIHNlcXVlbmNlcyAobm90IHlldCBmdWxseSBoYW5kbGluZyBhbGwgZXNjYXBlIHNlcXVlbmNlcykKICAgIGlmICghQ09NTUVOVCkgewogICAgICAgIHByaW50ZigiXG5cdCAlcyBpcyBhIFNUUklORyIsIHl5dGV4dCk7CiAgICB9Cn0KClswLTldKyB7CiAgICAvLyBOdW1iZXJzCiAgICBpZiAoIUNPTU1FTlQpIHsKICAgICAgICBwcmludGYoIlxuICVzIGlzIGEgTlVNQkVSICIsIHl5dGV4dCk7CiAgICB9Cn0KClwpKFw6KT8gewogICAgLy8gTWF0Y2hlcyAnKScgZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgJzonCiAgICBpZiAoIUNPTU1FTlQpIHsKICAgICAgICBwcmludGYoIlxuXHQiKTsKICAgIH0KICAgIEVDSE87IC8vIFByaW50IHRoZSB0b2tlbgogICAgcHJpbnRmKCJcbiIpOwp9CgpcKCB7CiAgICAvLyBNYXRjaGVzIG9wZW5pbmcgJygnCiAgICBFQ0hPOwp9Cgo9IHsKICAgIC8vIEFzc2lnbm1lbnQgb3BlcmF0b3IgJz0nCiAgICBpZiAoIUNPTU1FTlQpIHsKICAgICAgICBwcmludGYoIlxuXHQgJXMgaXMgYW4gQVNTSUdOTUVOVCBPUEVSQVRPUiIsIHl5dGV4dCk7CiAgICB9Cn0KClw8PSB8Clw+PSB8Clw8IHwKPT0gfApcPiB8CiE9IHsKICAgIC8vIFJlbGF0aW9uYWwgb3BlcmF0b3JzCiAgICBpZiAoIUNPTU1FTlQpIHsKICAgICAgICBwcmludGYoIlxuXHQlcyBpcyBhIFJFTEFUSU9OQUwgT1BFUkFUT1IiLCB5eXRleHQpOwogICAgfQp9CgolJQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBGSUxFICpmaWxlOwogICAgZmlsZSA9IGZvcGVuKCJ2YXIuYyIsICJyIik7CgogICAgaWYgKCFmaWxlKSB7CiAgICAgICAgcHJpbnRmKCJjb3VsZCBub3Qgb3BlbiB0aGUgZmlsZSIpOwogICAgICAgIGV4aXQoMCk7CiAgICB9CgogICAgeXlpbiA9IGZpbGU7IC8vIFVzZSBmaWxlIGlucHV0CiAgICB5eWxleCgpOyAgICAgLy8gU3RhcnQgbGV4aWNhbCBhbmFseXNpcwogICAgcHJpbnRmKCJcbiIpOwogICAgcmV0dXJuKDApOwp9CgppbnQgeXl3cmFwKCkgewogICAgcmV0dXJuKDEpOyAvLyBFbmQgb2YgaW5wdXQKfQo=
stdin
I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CmludCBtYWluKCkgewogICAgaW50IHggPSAxMDsKICAgIGlmICh4ICZndDsgNSkgewogICAgICAgIHByaW50ZigmcXVvdDt4IGlzIGdyZWF0ZXIgdGhhbiA1JnF1b3Q7KTsKICAgIH0KfQo=
#include <stdio.h>
int main() {
int x = 10;
if (x > 5) {
printf("x is greater than 5");
}
}