1. Program to test validity of a sample expression involving operators +, -,* and /.
Calcval.y
%{
#include<stdio.h>
#include<stdlib.h>
%}
%token NUM
%%
start : S | S
start ;
S : E'\n'
{printf("Valid Expression");}
| error '\n' {yyerror("Enter valid
expression");}
;
E : E '+' T
| E '-' T
| T
;
T : T '*' F
| T '/' F
| F
;
F : '(' E ')'
| '-' F
| NUM
;
%%
yyerror(char
*msg)
{
printf("Invalid
Expression : %s\n",msg);
}
void main()
{
printf("Enter
Expression...> \n");
yyparse();
}
Call.l
%{
#include<stdio.h>
#include<stdlib.h>
#include
"y.tab.h"
%}
%%
[0-9]+(\.[0-9]+)?([eE][0-9]+)?
{yylval=atof(yytext);return NUM;}
[-+()*/]|\n
{return yytext[0];}
[ \t] {;}
%%
2. Program to evaluate an arithmetic expression involving operators +, -, * and /.
Calc.y
%{
#include<stdio.h>
#include<stdlib.h>
%}
%union {
float f;
}
%token <f>
NUM
%type <f>
E T F
%%
start : S | S
start ;
S : E'\n'
{printf("%f\n",$1);}
| error '\n' {yyerror("Enter valid
expression");}
;
E : E '+' T {$$
= $1 + $3;}
| E '-' T {$$ = $1 - $3;}
| T {$$ = $1;}
;
T : T '*' F {$$
= $1 * $3;}
| T '/' F {$$ = $1 / $3;}
| F {$$ = $1;}
;
F : '(' E ')'
{$$ = $2;}
| '-' F {$$ = -$2;}
| NUM {$$ = $1;}
;
%%
yyerror(char
*msg)
{
printf("Invalid
Expression : %s\n",msg);
}
void main()
{
printf("Enter
Expression...> \n");
yyparse();
}
Caal.l
%{
#include<stdio.h>
#include<stdlib.h>
#include "y.tab.h"
%}
%%
[0-9]+(\.[0-9]+)?([eE][0-9]+)?
{yylval.f=atof(yytext);return NUM;}
[-+()*/]|\n
{return yytext[0];}
[ \t] {;}
%%
Anb.y
%{
#include<stdio.h>
%}
%token A B
%%
start : variable
| variable start ;
variable : A
A A A A A A A A A var B '\n' {printf("\nValid variable \n");}
| error
'\n' {yyerror("\nInvalid variable \n");}
;
var : A
var
| {;}
;
%%
main()
{
printf("Enter
the variable:\n");
yyparse();
}
yyerror(char *s)
{
printf("%s",s);
}
Anb.l
%{
#include<stdio.h>
#include
"y.tab.h"
%}
%%
[aA] {return A;}
[bB] {return B;}
.|\n {return yytext[0];}
%%
4. Program to recognize a valid variable, which starts with a letter, followed by any number of letters or digits.
Vari.y
%{
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
%}
%token let dig
%%
start : TERM |
TERM start ;
TERM: XTERM '\n' {printf("\nAccepted\n");}
|
error '\n' {yyerror ("\nRejected\n");}
;
XTERM: XTERM let
| XTERM dig
| let
;
%%
main()
{
printf("Enter a variable:");
yyparse();
}
yyerror(char *s)
{
printf("%s",s);
}
Vari.l
%{
#include<stdio.h>
#include
"y.tab.h"
%}
%%
[a-zA-Z_] {return let;}
[0-9] {return dig;}
.|\n {return yytext[0];}
%%
5. Program to recognize nested IF control statements and display the number of levels of
nesting.
nesting.
Nestif.y
%{
#include "stdio.h"
int level=0;
%}
%token IF SIMP OP
%%
stmt: if_stmt
{printf("\nValid levels=%d\n",level);}
| error { printf("---ERROR---\n");}
;
if_stmt: IFCOND SIMP
| IFCOND if_stmt
| IFCOND '{' EXP '}'
| IFCOND '{' if_stmt '}'
IFCOND: IF '(' EXP ')'
{level++;}
;
EXP: | SIMP OP SIMP
| SIMP
;
%%
yyerror(char *s)
{
printf("Invalid");
}
Nestif.l
%{
#include "y.tab.h"
%}
%%
"if" return IF;
"==" return OP;
[<>+] return OP;
[{()}] return *yytext;
[a-zA-Z]* return SIMP;
" " {;}
. { }
%%
void main()
{
yyin=fopen("a.c","r");
yyparse();
}
6. Program to recognize strings ' aaab', ' abbb', 'ab' and 'a' using the grammar.
%{
#include<stdio.h>
#include<stdlib.h>
%}
%token a b
%%
start : S start
| S ;
S : A
'\n' {printf("\nString belongs to
grammar..\n");}
| error
'\n' {yyerror("\nstring
does not belong to grammar..\n");}
;
A : a
a a b
| a
b b b
| a
b
| a
;
%%
main()
{
printf("Enter String for
GRAMMAR:\n");
yyparse();
}
yylex()
{
char ch;
while((ch=getchar())==' ');
if(ch=='a'||ch=='A')
return a;
if(ch=='b'||ch=='B')
return b;
return ch;
}
yyerror(char *s)
{
printf("%s",s);
}
good job hitesh..
ReplyDeleteGood Hitesh...
ReplyDeleteIts really Helpful👍
thanks
ReplyDeletecomment for the queries u have
Nice. .
ReplyDelete