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);
}