lex
%{
#include "y.tab.h"
%}
%%
"for" { return FOR; }
"(" { return '('; }
")" { return ')'; }
"{" { return '{'; }
"}" { return '}'; }
"==" { return EQ; }
"<=" { return LE; }
">=" { return GE; }
"++" { return INC; }
"--" { return DEC; }
"=" { return '='; }
"<" { return '<'; }
">" { return '>'; }
";" { return ';'; }
[a-zA-Z]+ { return ID; }
[0-9]+ { return NUM; }
[ \\t\\n] ; // ignore whitespace
. ; // ignore anything else
%%
int yywrap(){
return 1;
}
yacc
%{
#include <stdio.h>
#include <stdlib.h>
int yylex();
void yyerror();
int count = 0;
%}
%token FOR ID NUM EQ LE GE INC DEC
%%
S : FORLOOP { printf("Valid\\n"); printf("Number of FOR loops = %d\\n", count); };
FORLOOP
: FOR '(' INIT ';' COND ';' UPDATE ')' BLOCK
{ count++; }
;
INIT : ID '=' NUM ;
COND
: ID '<' NUM
| ID '>' NUM
| ID LE NUM
| ID GE NUM
| ID EQ NUM
;
UPDATE
: ID INC
| ID DEC
;
BLOCK
: '{' BODY '}'
;
BODY
: FORLOOP BODY
| /* empty */ // ✅ allows empty block
;
%%
int main(){
printf("Enter code:\\n");
yyparse();
return 0;
}
void yyerror(){
printf("Invalid\\n");
exit(0);
}