0% found this document useful (0 votes)
87 views49 pages

Part-A: Department of CSE System Software & Compiler Design Laboratory

The document describes a YACC program that recognizes strings matching the grammar AnBn (n >= 0). The program uses LEX and YACC to define tokens and grammar rules. It prompts the user for a string, parses it using YACC, and indicates whether it is valid or produces an error. When given the string "aaaaaaaaaaab", it outputs "Valid", but for the string "aab" it outputs "error".

Uploaded by

SaiprasadBejgam
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
87 views49 pages

Part-A: Department of CSE System Software & Compiler Design Laboratory

The document describes a YACC program that recognizes strings matching the grammar AnBn (n >= 0). The program uses LEX and YACC to define tokens and grammar rules. It prompts the user for a string, parses it using YACC, and indicates whether it is valid or produces an error. When given the string "aaaaaaaaaaab", it outputs "Valid", but for the string "aab" it outputs "error".

Uploaded by

SaiprasadBejgam
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 49

Department of CSE System software & Compiler design laboratory

PART-A

Name: Sujay P Page 1 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$cat > input
Girish rao salanke
$lex p1a.l
$cc lex.yy.c –ll
$./a.out
Enter the filename: input
Character=16
Blank=2
Lines=1
Word=3

Name: Sujay P Page 2 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

PART – A

1 (a) Program using LEX to count the number of characters, words,


spaces and lines in a given input file.

%{
int ch=0, bl=0, ln=0, wr=0;
%}
%%
[\n] {ln++;wr++;}
[\t] {bl++;wr++;}
[" "] {bl++;wr++;}
[^\n\t] {ch++;}
%%
int main()
{
FILE *fp;
char file[10];
printf("Enter the filename: ");
scanf("%s", file);
yyin=fp;
yylex();
printf("Character=%d\nBlank=%d\nLines=%d\nWords=%d", ch, bl, ln, wr);
return 0;
}

Name: Sujay P Page 3 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$lex p1b.l
$cc lex.yy.c –ll
$./a.out

Write a C program
#include<stdio.h>
int main()
{
int a, b;
/*float c;*/
printf(“Hi”);
/*printf(“Hello”);*/
}
[Ctrl-d]
Comment=1

$cat output

#include<stdio.h>
int main()
{
int a, b;
printf(“Hi”);
}

Name: Sujay P Page 4 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

1 (b) Program using LEX to count the numbers of comment lines in a


given C program. Also eliminate them and copy the resulting
program into separate file.

%{
int com=0;
%}
%%
"/*"[^\n]+"*/" {com++;fprintf(yyout, " ");}
%%
int main()
{
printf("Write a C program\n");
yyout=fopen("output", "w");
yylex();
printf("Comment=%d\n",com);
return 0;
}

Name: Sujay P Page 5 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$lex p2a.l
$cc lex.yy.c –ll
$./a.out
Enter the expression
(a+b*c)
a is an identifier
b is an identifier
c is an identifier

[Ctrl-d]
Valid expression
Add=1
Sub=0
Mul=1
Div=0
Operators are:
+
*

Name: Sujay P Page 6 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

2 (a) Program using LEX to recognize a valid arithmetic expression


and to recognize the identifiers and operators present. Print them
separately.
%{
#include<stdio.h>
int a=0,s=0,m=0,d=0,ob=0,cb=0;
int flaga=0, flags=0, flagm=0, flagd=0;
%}
id [a-zA-Z]+
%%
{id} {printf("\n %s is an identifier\n",yytext);}
[+] {a++;flaga=1;}
[-] {s++;flags=1;}
[*] {m++;flagm=1;}
[/] {d++;flagd=1;}
[(] {ob++;}
[)] {cb++;}
%%
int main()
{
printf("Enter the expression\n");
yylex();
if(ob-cb==0)
{
printf("Valid expression\n");
}
else
{
printf("Invalid expression");
}
printf("\nAdd=%d\nSub=%d\nMul=%d\nDiv=%d\n",a,s,m,d);
printf("Operators are: \n");
if(flaga)
printf("+\n");
if(flags)
printf("-\n");
if(flagm)
printf("*\n");
if(flagd)
printf("/\n");
return 0;
}

Name: Sujay P Page 7 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$lex p2b.l
$cc lex.yy.c –ll
$./a.out
Enter the sentence
Rose is beautiful
Rose is beautiful
[Ctrl-d]
Simple sentence

$./a.out
Enter the sentence
CSE or ISE
CSE or ISE
[Ctrl-d]
Compound sentence

Name: Sujay P Page 8 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

2 (b) Program using LEX to recognize whether a given sentence is


simple or compound.

%{
int flag=0;
%}
%%
(""[aA][nN][dD]"")|(""[oO][rR]"")|(""[bB][uU][tT]"") {flag=1;}
%%
int main()
{
printf("Enter the sentence\n");
yylex();
if(flag==1)
printf("\nCompound sentence\n");
else
printf("\nSimple sentence\n");
return 0;
}

Name: Sujay P Page 9 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$cat > input
int
float
78f
90gh
a
d
are case
default
printf
scanf

$lex p3.l
$cc lex.yy.c –ll
$./a.out
Enter the filename: input
int is a keyword
float is a keyword
78f is not an identifier
90g is not an identifier
h is an identifier
a is an identifier
d is an identifier
are is an identifier
case is a keyword
default is a keyword
printf is a keyword
scanf is a keyword
total identifiers are: 4

Name: Sujay P Page 10 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

3. Program using LEX to recognize and count the number of


identifiers in a given input file.

%{
#include<stdio.h>
int count=0;
%}
op [+-*/]
letter [a-zA-Z]
digitt [0-9]
id {letter}*|({letter}{digitt})+
notid ({digitt}{letter})+
%%
[\t\n]+
("int")|("float")|("char")|("case")|("default")| ("if")|("for")|("printf")|("scanf")
{printf("%s is a keyword\n", yytext);}
{id} {printf("%s is an identifier\n", yytext); count++;}
{notid} {printf("%s is not an identifier\n", yytext);}
%%
int main()
{
FILE *fp;
char file[10];
printf("\nEnter the filename: ");
scanf("%s", file);
fp=fopen(file,"r");
yyin=fp;
yylex();
printf("Total identifiers are: %d\n", count);
return 0;
}

Name: Sujay P Page 11 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT

$lex p4a.l
$yacc –d p4a.y
$cc lex.yy.c y.tab.c –ll
$./a.out
Enter the expression
(a*b+5)
Expression is valid

$./a.out
Enter the expression
(a+6-)
Expression is invalid

Name: Sujay P Page 12 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

4 (a) YACC program to recognize a valid arithmetic expression that


uses operators +, -, * and /.

LEX
%{
#include"y.tab.h"
extern yylval;
%}
%%
[0-9]+ {yylval=atoi(yytext); return NUMBER;}
[a-zA-Z]+ {return ID;}
[\t]+ ;
\n {return 0;}
. {return yytext[0];}
%%

YACC
%{
#include<stdio.h>
%}
%token NUMBER ID
%left '+' '-'
%left '*' '/'
%%
expr: expr '+' expr
|expr '-' expr
|expr '*' expr
|expr '/' expr
|'-'NUMBER
|'-'ID
|'('expr')'
|NUMBER
|ID
;
%%
main()
{
printf("Enter the expression\n");
yyparse();
printf("\nExpression is valid\n");
exit(0);
}
int yyerror(char *s)
{
printf("\nExpression is invalid");
exit(0);
}

Name: Sujay P Page 13 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$lex p4b.l
$yacc –d p4b.y
$cc lex.yy.c y.tab.c –ll
$./a.out
input34
The string is a valid variable

$./a.out
89file
This is not a valid variable

Name: Sujay P Page 14 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

4 (b) YACC program to recognize a valid variable, which starts with


a letter, followed by any number of letters or digits.

LEX
%{
#include"y.tab.h"
extern yylval;
%}
%%
[0-9]+ {yylval=atoi(yytext); return DIGIT;}
[a-zA-Z]+ {return LETTER;}
[\t] ;
\n return 0;
. {return yytext[0];}
%%

YACC
%{
#include<stdio.h>
%}
%token LETTER DIGIT
%%
variable: LETTER|LETTER rest
;
rest: LETTER rest
|DIGIT rest
|LETTER
|DIGIT
;
%%
main()
{
yyparse();
printf("The string is a valid variable\n");
}
int yyerror(char *s)
{
printf("this is not a valid variable\n");
exit(0);
}

Name: Sujay P Page 15 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$lex p5a.l
$yacc –d p5a.y
$cc lex.yy.c y.tab.c –ll
$./a.out
Enter the expr in terms of integers
5+6*3
23
Success

Name: Sujay P Page 16 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

5 (a) YACC program to evaluate an arithmetic expression involving


operators +, -, * and /.

LEX
%{
#include"y.tab.h"
#include<math.h>
extern yylval;
%}
%%
[0-9]+ {yylval=atoi(yytext); return NUM;}
[+] {return '+';}
[-] {return '-';}
[*] {return '*';}
[/] {return '/';}
[\t]+ ;
[\n] {return 0;}
. {return yytext[0];}
%%
%{#include<stdio.h>
%}
%token NUM
%left '-' '+'
%right '*' '/'
%%
start: exp {printf("%d\n", $$);}
exp: exp '+' exp {$$=$1+$3;}
   | exp '-' exp {$$=$1-$3;}
   | exp '*' exp {$$=$1*$3;}
   | exp '/' exp 
  {if($3==0)
   yyerror("error");else
{
   $$=$1/$3;
}
 }
  | '('exp')' {$$=$2;}
  | NUM {$$=$1;}
  ;
%%
main()
{
printf("Enter the expr in terms of integers\n");
if(yyparse()==0)
printf("Success\n");
}
yyerror()
{
printf("Error\n");
}

Name: Sujay P Page 17 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$lex p5b.l
$yacc –d p5b.y
$cc lex.yy.c y.tab.c –ll
$./a.out
Enter the string
aabb
[Ctrl-d]
Valid

$./a.out
Enter the string
aab
syntax error

Name: Sujay P Page 18 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

5 (b) YACC program to recognize strings ‘aaab’, ‘abbb’, ‘ab’ and ‘a’
using the grammar (anbn, n>= 0).

LEX
%{
#include"y.tab.h"
%}
%%
[a] return A;
[b] return B;
%%

YACC
%{
#include<stdio.h>
%}
%token A B
%%
S:A S B
|
;
%%
main()
{
printf("Enter the string\n");
if(yyparse()==0)
{
printf("Valid\n");
}
}
yyerror(char *s)
{
printf("%s\n",s);
}

Name: Sujay P Page 19 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$lex p6.l
$yacc –d p6.y
$cc lex.yy.c y.tab.c –ll
$./a.out
Enter the string
aaaaaaaaaaab
Valid

$./a.out
Enter the string
aab
error

Name: Sujay P Page 20 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

6. Program to recognize the grammar (anb, n>= 10).

LEX
%{
#include"y.tab.h"
%}
%%
[a] return A;
[b] return B;
%%

YACC
%{
#include<stdio.h>
%}
%token A B
%%
stat:exp B
;
exp:A A A A A A A A A exp1
;
exp1:A exp2
|A
|A A exp2
|A A A exp2
|A A A A exp2
;
exp2:A
;
%%
main()
{
printf("Enter the string\n");
if(yyparse()==0)
{
printf("Valid\n");
}
}
yyerror(char *s)
{
printf("error\n");
}

Name: Sujay P Page 21 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

Name: Sujay P Page 22 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

PART-B

Name: Sujay P Page 23 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$chmod 777 1a.sh
$./1a.sh a b c

Number of arguments are: 3


c
b
a

Name: Sujay P Page 24 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

PART – B

1 (a) Non-recursive shell script that accepts any number of


arguments and prints them in the reverse order.

echo "number of arguments are: $#"


len=$#
while [ $len -ne 0 ]
do
eval echo \$$len
len=`expr $len - 1`
done

Name: Sujay P Page 25 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$cc 1b.c
$./a.out

Enter the command to be executed: date


Mon Feb 16 13:59:13 IST 2009

Name: Sujay P Page 26 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

1 (b) C program that creates a child process to read commands from


the standard input and execute them. You can assume that no
arguments will be passed to the commands to be executed.

#include<stdio.h>
#include<sys/types.h>
int main()
{
char cmd[20];
pid_t pid;
int ch;
pid=fork();
if(pid==0)
{
do
{
printf("\nEnter the command to be executed:");
scanf("%s", cmd);
system(cmd);
printf("\nEnter 1 to continue and 0 to exit:");
}
while(ch!=0);
}
wait();
}

Name: Sujay P Page 27 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$chmod 777 2a.sh
$cat > file1
This is the first file
$cat > file2
This is the second file

$./2a.sh file1 file2


Both the files have same permission
-rw-r--r--

$chmod 777 file2


$./2a.sh file1 file2
Both the files have different permission
The permission of the first file file1 is
-rw-r--r--
The permission of the second file file2 is
-rwxrwxrwx

Name: Sujay P Page 28 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

2 (a) Shell script that accepts two file names as arguments, checks if
the permissions for these files are identical and if the permissions are
identical, outputs the common permissions, otherwise outputs each
file name followed by its permissions
ls -l $1 | cut -d " " -f1 > file1
ls -l $2 | cut -d " " -f1 > file2
if cmp file1 file2
then
echo "Both the files have same permission"
cat file1
else
echo "Both the files have different permission"
echo "The permission of the first file $1 is "
cat file1
echo "The permission of the second file $2 is "
cat file2
fi

Name: Sujay P Page 29 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$cc 2b.c
$./a.out
$od –c cse
0000000 D e p a r t m e n t O f C S
0000020 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
*
0000060 D e p a r t m e n t O f I S
0000100

Name: Sujay P Page 30 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

2 (b) C program to create a file with 16 bytes of arbitrary data from


the beginning and another 16 bytes of arbitrary data from an offset
of 48. Display the file contents to demonstrate how the hole in file is
handled.

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
int fd;
char buf1[]="Department of CS";
char buf2[]="Department of IS";
fd=creat("cse", 0622);
if(fd<0)
{
printf("\nError in creating file");
exit(0);
}
write(fd, buf1, 16);
lseek(fd, 48, SEEK_SET);
write(fd, buf2, 16);
exit(0);
}

Name: Sujay P Page 31 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$chmod 777 3a.sh
$ls –l
total 12
-rwxr-xr-x 1 root root 148 Mar 1 22:17 1a.sh
-rwxr-xr-x 1 root root 366 Mar 1 22:17 2a.sh
-rwxrwxrwx 1 root root 192 Mar 1 22:17 3a.sh

$./3a.sh /cse/usp
The max size of the file in directory /cse/usp is 366 bytes

Name: Sujay P Page 32 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

3 (a) Shell function that takes a valid directory names as an argument


and recursively descends all the subdirectories, finds the maximum
length of any file in that hierarchy and writes this maximum value to
the standard output.

maxsize=`ls -lR $1 | grep '^-' | cut -c 24-27 | sort -n | tail -1`


echo "The max size of the file in directory $1 is $maxsize bytes"

Name: Sujay P Page 33 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$cc 3b.c
$./a.out /cse/3b.c
/cse/3b.c: File is a regular file
$./a.out /cse
/cse: File is a directory file
$./a.out /dev/tty /cse/prog3a
/dev/tty: File is a character file
/cse/prog3a: File is a symbolic link file

Name: Sujay P Page 34 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

3 (b) C program that accepts valid file names as command line


arguments and for each of the arguments, prints the type of the file
( Regular file, Directory file, Character special file, Block special file,
Symbolic link etc.)

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int i;
struct stat buf;
for(i=1;i<argc;i++)
{
printf("%s: ",argv[i]);
lstat(argv[i], &buf);
if(S_ISREG(buf.st_mode))
printf("File is a regular file\n");
if(S_ISDIR(buf.st_mode))
printf("File is a directory file\n");
if(S_ISCHR(buf.st_mode))
printf("File is a character file\n");
if(S_ISBLK(buf.st_mode))
printf("File is a block file\n");
if(S_ISLNK(buf.st_mode))
printf("File is a symbolic link file\n");
}
exit(0);
}

Name: Sujay P Page 35 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$chmod 777 4a.sh
$ls
10b.c 1b.c 4a.sh 5a.sh 5b.c 6a.sh 6b.c 7a.sh 8a.sh 9a.sh a

$cat > file1


This is the first file

$cat > file2


This is the second file

$ls
10b.c 4a.sh 5b.c 6b.c 8a.sh a file2
1b.c 5a.sh 6a.sh 7a.sh 9a.sh file1

$./4a.sh file1 file2 > new.sh

$ls
10b.c 4a.sh 5b.c 6b.c 8a.sh a file2
1b.c 5a.sh 6a.sh 7a.sh 9a.sh file1 new.sh

$rm file1
rm: remove regular file ‘file1’? y
$rm file2
rm: remove regular file ‘file2’? y

$ls
10b.c 4a.sh 5b.c 6b.c 8a.sh a
1b.c 5a.sh 6a.sh 7a.sh 9a.sh new.sh

$chmod 777 new.sh

$./new.sh
file1
file2

$ls
10b.c 4a.sh 5b.c 6b.c 8a.sh a file2
1b.c 5a.sh 6a.sh 7a.sh 9a.sh file1 new.sh

$cat file1
This is the first file

$cat file2
This is the second file

Name: Sujay P Page 36 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

4 (a) Shell script that accepts file names specified as arguments and
creates a shell script that contains this file as well as the code to
recreate these files. Thus if the script generated by your script is
executed, it would recreate the original files.

echo '#to bundle, sh this file'


for i in $*
do
echo "echo $i 1> &2"
echo "cat>$i << 'End of $i'"
cat $i
echo "End of $i"
done

Name: Sujay P Page 37 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT
$cc 4b.c
$./a.out

This is child process


Child PID: 3122
Parent PID: 3121

This is parent process


Parent PID: 3121
Child PID: 3122

Name: Sujay P Page 38 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

4 (b) C program to do the following: Using fork( ) create a child


process. The child process prints its own process-id and id of its
parent and then exits. The parent process waits for its child to finish
(by executing the wait()) and prints its own process-id and the id of
its child process and then exits.

#include<sys/types.h>
#include<stdio.h>
int main()
{
int pid;
pid=fork();
if(pid<0)
printf("fork error");
if(pid==0)
{
printf("\nThis is child process");
printf("\nChild PID: %d", getpid());
printf("\nParent PID: %d", getppid());
execlp("/bin/ls",NULL);
exit(0);
}
else
{
wait(NULL);
printf("\nThis is parent process");
printf("\nParent PID: %d", getpid());
printf("\nChild PID: %d", pid);
exit(0);
}
}

Name: Sujay P Page 39 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

Name: Sujay P Page 40 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

COMPILER DESIGN PROGRAMS

Name: Sujay P Page 41 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT

Format of ‘if’ statement


Example ...
if (a<b) then (s=a);
if (a<b) then (s=a) else (s=b);

Enter the statement


if (a<b) then (x=a) else (x=b);

Parsing the input statement....


If (a<b) goto 101
goto 102
101: (x=a)
goto 103
102: (x=b)
103:

Name: Sujay P Page 42 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

5. Write a C program to implement the syntax-directed definition of


“if E then S1” and “if E then S1 else S2”.

/* Input to the program is assumed to be syntactically correct. The expression of ‘if’


statement, for true condition and statement for false condition are enclosed in
parenthesis */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int parsecondition(char[],int,char*,int);
void gen(char [],char [],char[],int);
int main()
{
int counter = 0,stlen =0,elseflag=0;
char stmt[60]; // contains the input statement
char strB[54]; // holds the expression for 'if'
condition
char strS1[50]; // holds the statement for true
condition
char strS2[45]; // holds the statement for false
condition

printf("Format of ‘if’ statement \n Example...\n");


printf("if (a<b) then (s=a);\n");
printf("if (a<b) then (s=a) else (s=b);\n\n");
printf("Enter the statement \n");
gets(stmt);
stlen = strlen(stmt);
counter = counter + 2; // increment over 'if'
counter = parsecondition(stmt,counter,strB,stlen);
if(stmt[counter]==')')
counter++;
counter = counter + 3; // increment over 'then'
counter = parsecondition(stmt,counter,strS1,stlen);
if(stmt[counter+1]==';')
{ //reached end of statement, generate the output
printf("\n Parsing the input statement....");
gen(strB,strS1,strS2,elseflag);

Name: Sujay P Page 43 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

return 0;
}
if(stmt[counter]==')')
counter++; // increment over ')'
counter = counter + 3; // increment over 'else'
counter = parsecondition(stmt,counter,strS2,stlen);
counter = counter + 2; // move to the end of
statement
if(counter == stlen)
{ //generate the output
elseflag = 1;
printf("\n Parsing the input statement....");
gen(strB,strS1,strS2,elseflag);
return 0;
}
return 0;
}
/* Function : parsecondition
Description : This function parses the statement
from the given index to get the statement enclosed
in ()
Input : Statement, index to begin search, string
to store the condition, total string length
Output : Returns 0 on failure, Non zero counter
value on success
*/
int parsecondition(char input[],int cntr,char
*dest,int totallen)
{
int index = 0,pos = 0;
while(input[cntr]!= '(' && cntr <= totallen)
cntr++;
if(cntr >= totallen)
return 0;
index = cntr;
while (input[cntr]!=')')
cntr++;
if(cntr >= totallen)
return 0;
while(index<=cntr)
dest[pos++] = input[index++];
dest[pos]='\0'; //null terminate the string
return cntr; //non zero value
}
/* Function : gen ()
Description : This function generates three
address code
Input : Expression, statement for true condition,
statement for false condition, flag to denote if
the 'else' part is present in the statement

Name: Sujay P Page 44 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

output :Three address code


*/
void gen(char B[],char S1[],char S2[],int elsepart)
{
int Bt =101,Bf = 102,Sn =103;
printf("\n\tIf %s goto %d",B,Bt);
printf("\n\tgoto %d",Bf);
printf("\n%d: ",Bt);
printf("%s",S1);
if(!elsepart)
printf("\n%d: ",Bf);
else
{ printf("\n\tgoto %d",Sn);
printf("\n%d: %s",Bf,S2);
printf("\n%d:",Sn);
}
}

Name: Sujay P Page 45 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

OUTPUT

$a.out
a+|b*|(b.c*)
This is the rightmost derivation--

re => re | re
=> re | (re)
=> re | (re . re)
=> re | (re . re*)
=> re | (re . c*)
=> re | (b . c*)
=> re | re | (b . c*)
=> re | re* | (b . c*)
=> re | b* | (b . c*)
=> re+ | b* | (b . c*)
=> a+ | b* | (b . c*)

Name: Sujay P Page 46 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

6. Write a yacc program that accepts a regular expression as input


and produce its parse tree as output.

%{
/**
Yacc program to recognise a regular expression
and produce a parse tree as output
*/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

/* To store the productions */


#define MAX 100

int getREindex ( const char* );

signed char productions[MAX][MAX];


int count = 0 , i , j;
char temp[MAX + MAX] , temp2[MAX + MAX];
%}

%token ALPHABET

%left '|'
%left '.'
%nonassoc '*' '+'

%%
S : re '\n' {
printf ( "This is the rightmost derivation--\n" );
for ( i = count - 1 ; i >= 0 ; --i ) {
if ( i == count - 1 ) {
printf ( "\nre => " );
strcpy ( temp , productions[i] );
printf ( "%s" , productions[i] );
}
else {
printf ( "\n => " );
j = getREindex ( temp );

Name: Sujay P Page 47 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

temp[j] = '\0';
sprintf ( temp2 , "%s%s%s" , temp ,
productions[i] , (temp + j + 2) );
printf ( "%s" , temp2 );
strcpy ( temp , temp2 );
}
}
printf ( "\n" );
exit ( 0 );
}
re : ALPHABET {
temp[0] = yylval; temp[1] = '\0';
strcpy ( productions[count++] , temp );
}
| '(' re ')'
{ strcpy ( productions[count++] , "(re)" ); }
| re '*'
{ strcpy ( productions[count++] , "re*" ); }
| re '+'
{ strcpy ( productions[count++] , "re+" ); }
| re '|' re
{strcpy ( productions[count++] , "re | re" );}
| re '.' re
{strcpy ( productions[count++] , "re . re" );}
;
%%
int main ( int argc , char **argv )
{
/*
Parse and output the rightmost derivation,
from which we can get the parse tree
*/
yyparse();

return 0;
}

yylex()
{
signed char ch = getchar();
yylval = ch;
if ( isalpha ( ch ) )
return ALPHABET;
return ch;
}

yyerror()
{
fprintf(stderr , "Invalid Regular Expression!!\n");
exit ( 1 );

Name: Sujay P Page 48 of 49 USN: 1MV08CS103


Department of CSE System software & Compiler design laboratory

int getREindex ( const char *str )


{
int i = strlen ( str ) - 1;
for ( ; i >= 0 ; --i ) {
if ( str[i] == 'e' && str[i-1] == 'r' )
return i-1;
}
}

Name: Sujay P Page 49 of 49 USN: 1MV08CS103

You might also like