Professional Documents
Culture Documents
Wa0030.
Wa0030.
Lex Part:
gedit lab1b.l
%{
#include "y.tab.h"
#include <stdlib.h>
extern int yylval;
%}
%%
[0-9]+ {yylval=atoi(yytext);
return NUM;}
\n return yytext[0];
. {return yytext[0];}
Yacc Part
gedit lab1b.y
%{
#include<stdio.h>
int valid=1;
%}
%token NUM
%left '+' ‘-‘
%right ‘*’ '/'
%%
void main()
{
printf("Enter an Arithmetic Exression:\n");
yyparse();
if(valid==1)
printf("Expression is valid\n");
}
int yyerror()
{
printf("Invalid Expression\n");
exit(0);
}
Execution command
Lex Part:
gedit lab2.l
%{
#include "y.tab.h"
%}
%%
a {return A;}
b {return B;}
\n {return 0;}
. {return yytext[0];}
Yacc Part
gedit lab2.y
%{
#include <stdio.h>
int acount=0,n;
%}
%token A
%token B
%%
S : X B { //if (acount < n || acount > n)
if(acount!=n)
{
YYFAIL();
}
}
X:XT|T
T : A { acount++;}
;
%%
int main()
{ printf("Enter the value of n \n");
scanf("%d",&n);
printf("Enter the string\n");
yyparse();
printf("Valid string\n");
}
int YYFAIL()
{
printf("Invalid count of 'a'\n");
exit(0);
}
int yyerror()
{
printf("Invalid string\n");
exit(0);
}
Lex Part:
gedit lab6b.l
%{
#include <stdio.h>
#include "y.tab.h"
%}
%%
int|char|bool|float|void|for|do|while|if|else|return|main {
printf("keyword is %s\n",yytext);return KEY;}
[+|-|*|/|=|<|>] {printf("operator is %s\n",yytext);return OP;}
[_a-zA-Z][a-zA-Z0-9]* {printf("identifier is %s\n",yytext);
return ID;}
.;
Yacc Part
gedit lab6b.y
%{
#include <stdio.h>
#include <stdlib.h>
int id=0, key=0, op=0;
%}
%token ID KEY OP
%%
| OP input {op++;}
| ID { id++; }
| KEY { key++; }
| OP { op++;}
%%
extern FILE *yyin;
void main()
yyin = fopen("input6b.c","r");
yyparse();
void yyerror()
printf("Not valid");
gedit input6b.c
void main()
{
int amount, _sum = 0;
float roi=12.3;
int total12 = amount * roi;
}
keyword is int
identifier is amount
identifier is _sum
operator is =
keyword is float
identifier is roi
operator is =
keyword is int
identifier is total12
operator is =
identifier is amount
operator is *
identifier is roi
Keywords = 5
Identifiers = 6
operators = 4
Lex Part:
gedit lab4.l
%{
#include "y.tab.h"
%}
%%
"id" {return id;}
"+" {return plus;}
"*" {return star;}
"(" {return opar;}
")" {return cpar;}
. return yytext[0];
\n return 0;
%%
Yacc Part :
gedit lab4.y
%{
#include<stdio.h>
#include<string.h>
extern FILE *yyin;
char inp[30],stack[30];
int inpCount, sCount;
%}
%token id
%token plus
%token star
%token opar
%token cpar
%%
E:EPT {
printf("$%s\t%s$\tREDUCE E -> E+T\n",stack,inp);
sCount -= 3;
stack[sCount++] = 'E';
stack[sCount] = '\0';
}
|T {
printf("$%s\t%s$\tREDUCE E -> T\n",stack,inp);
sCount -= 1;
stack[sCount++] = 'E';
stack[sCount] = '\0';
}
T:TSF {
printf("$%s\t%s$\tREDUCE T -> T*F \n",stack,inp);
sCount -= 3;
stack[sCount++] = 'T';
stack[sCount] = '\0';
}
|F {
printf("$%s\t%s$\tREDUCE T -> F \n",stack,inp);
sCount -= 1;
stack[sCount++] = 'T';
stack[sCount] = '\0';
}
F:OEC {
printf("$%s\t%s$\tREDUCE F -> (E) \n",stack,inp);
sCount -= 3;
stack[sCount++] = 'F';
stack[sCount] = '\0';
}
F : id {
printf("$%s\t%s$\tSHIFT id\n",stack,inp);
inp[inpCount++] = ' ';
inp[inpCount++] = ' ';
stack[sCount++] = 'i';
stack[sCount++] = 'd';
stack[sCount] = '\0';
O : opar {
printf("$%s\t%s$\tSHIFT (\n",stack,inp);
inp[inpCount++] = ' ';
stack[sCount++] = '(';
stack[sCount] = '\0';
}
C : cpar {
printf("$%s\t%s$\tSHIFT )\n",stack,inp);
inp[inpCount++] = ' ';
stack[sCount++] = ')';
stack[sCount] = '\0';
}
P : plus {
printf("$%s\t%s$\tSHIFT +\n",stack,inp);
inp[inpCount++] = ' ';
stack[sCount++] = '+'
stack[sCount] = '\0';
}
S : star {
printf("$%s\t%s$\tSHIFT *\n",stack,inp);
inp[inpCount++] = ' ';
stack[sCount++] = '*';
stack[sCount] = '\0';
}
;
%%
void main(){
printf("Enter the input : \n");
scanf("%s",inp);
FILE *fp = fopen("temp.txt","w");
fprintf(fp,"%s",inp);
fclose(fp);
yyin = fopen("temp.txt","r");
printf("Stack\tInput\tAction\n");
yyparse();
int yyerror(){
printf("$%s\t%s$\tError\n",stack,inp);
}
Output:
$yacc lab4.y -ld
$ lex lab4.l
$ cc y.tab.c lex.yy.c -ll