lex

%{
#include "y.tab.h"
%}

%%
"int"|"void"|"char"|"float"|"double" { return TYP; }
"return" { return RETURN; }

[a-zA-Z_][a-zA-Z0-9_]* { return ID; }

"(" { return LP; }
")" { return RP; }
"{" { return LB; }
"}" { return RB; }
";" { return SC; }
"," { return CM; }
"=" { return EQ; }

"+"|"-"|"*"|"/" { return OP; }

[0-9]+ { return NUM; }

[ \\t\\n] ;
. ;
%%

int yywrap(){ return 1; }

yacc

%{
#include <stdio.h>
#include <stdlib.h>

int yylex();
void yyerror();
%}

%token TYP ID LP RP LB RB SC CM EQ OP RETURN NUM

%%

prog: func ;

func:
    TYP ID LP params RP LB stmts RB
    { printf("Valid Function\\n"); }
;

params:
      /* empty */
    | param
    | param ',' param
;

param:
    TYP ID
;

stmts:
    stmt
  | stmts stmt
;

stmt:
    TYP ID SC
  | TYP ID EQ expr SC
  | expr SC
  | RETURN expr SC
;

expr:
    ID
  | NUM
  | ID EQ expr
  | expr OP expr
  | LP expr RP
;

%%

int main(){
    printf("Enter function:\\n");
    yyparse();
    return 0;
}

void yyerror(){
    printf("Invalid Function\\n");
    exit(0);
}