Database and Compiler Lab
Database and Compiler Lab
2 DML Commands
3 Querying
4 Triggers
5 Procedures
6 Cursors
A.Create tables:
mysql>create table bus(BusNo varchar(10),source varchar(10),Destination
varchar(10),Primary
Key(BusNo));
Query OK, 0 rows affected (0.31 sec)
B. Describe Tables:
+---------------+---------------+------+----------+-----------+---------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+----------+----------+---------+
| bus no | varchar(10) | NO | PRI | | |
| source | varchar(15) | YES | | NULL | |
| destination | varchar(15) | YES | | NULL | |
+---------------+---------------+------+-----------+----------+---------+
3 rows in set (0.03 sec)
3. Querying
1.Display unique Pnr_No of all passengers
mysql> select distinct pnr_no from passenger;
+--------+
| pnr_no |
+--------+
| 1001 |
| 1002 |
| 1005 |
| 1023 |
| 1040 |
| 1435 |
| 1956 |
+--------+
7 rows in set (0.02 sec)
+----------+
| name |
+----------+
| sam |
| prashant|
| ranga |
| subhani |
+----------+
4 rows in set (0.00 sec)
4.Display the source and destination having journey time more than 10 hours.
5.Find the ticket numbers of the passengers whose name start with “A” and ends with “H”
mysql> select name,age from passenger where age between 30 and 45;
+-----------+------+
| name | age |
+-----------+------+
| bala | 30 |
| anitha | 33 |
| alah | 30 |
| ah | 30 |
| subhani | 33 |
+-----------+-------+
5 rows in set (0.20 sec)
| subhani |
+-----------+
9 rows in set (0.01 sec)
10.Write a query to display the information present in the passenger and cancellation tables use UNION
Operator
mysql> select pnr_no from passenger union select pnr_no from cancellation;
+---------+
| pnr_no |
+---------+
| 1001 |
| 1002 |
| 1005 |
| 1008 |
| 1009 |
| 1023 |
| 1040 |
| 1435 |
| 1956 |
+---------+
9 rows in set (0.01 sec)
11. Display the number of days in a week on which the bus is available.
12. Find number of seats booked for each PNR_NO using Group by Clause
Hint: Use Group By On PNR_NO
+----------+
9 rows in set (0.00 sec)
15. Write a query to count the number of tickets booked for the buses, which traveled after the date “2010-
07-02”.
4.Triggers:
Creation of Insert trigger, Delete Trigger, Update Trigger
EX:
mysql> delimiter $$;
mysql> create trigger updatecheck before update on passenger for each row
-> begin
-> if new.ticket_no>60 then
-> set new.ticket_no=ticket_no;
-> else
-> set new.ticket_no=0;
-> end if;
-> end$$;
Query OK, 0 rows affected (0.08 sec)
mysql> delimiter ;
5.Procedures:
In this we will learn creation of stored procedure, Execution of procedure and
Modification of procedure.
mysql> delimiter ;
mysql> call p1();
+----------------------+
| count(ticket_no) |
+----------------------+
| 3 |
+----------------------+
1 row in set (0.03 sec)
6.cursors:
We will define a cursor that defines a result set. Open the cursor to establish the
Result set. Fetch the data into local variables as needed from the cursor one
Row at a time. Then we will close the cursor.
mysql> delimiter ;
#include<string.h>
#include<ctype.h>
#include<stdio.h>
void keyword(char str[10])
{if(strcmp("for",str)==0||strcmp("while",str)==0||strcmp("do",str)==0||
strcmp("int",str)==0||strcmp("float",str)==0||strcmp("char",str)==0||
strcmp("double",str)==0||strcmp("static",str)==0||strcmp("switch",str)==0||
strcmp("case",str)==0)
printf("\n%s is a keyword",str);
else
printf("\n%s is an identifier",str);
}main()
{
FILE *f1,*f2,*f3;
char c,str[10],st1[10];
int num[100],lineno=0,tokenvalue=0,i=0,j=0,k=0;
putc(c,f1);
fclose(f1);
f1=fopen("input","r");
f2=fopen("identifier","w");
f3=fopen("specialchar","w");
while((c=getc(f1))!=EOF)
{
if(isdigit(c))
{
tokenvalue=c-'0';
c=getc(f1);
while(isdigit(c))
{
tokenvalue*=10+c-'0';
c=getc(f1);
}num[i++]=tokenvalue;
ungetc(c,f1);
}else if(isalpha(c))
{
putc(c,f2);
c=getc(f1);
while(isdigit(c)||isalpha(c)||c=='_'||c=='$')
{
putc(c,f2);
c=getc(f1);
}putc(' ',f2);
ungetc(c,f1);
}else if(c==' '||c=='\t')
printf(" ");
else if(c=='\n')
lineno++;
else
putc(c,f3);
}fclose(f2);
fclose(f3);
fclose(f1);
printf("\nThe no's in the program are");
for(j=0;j<i;j++)
printf("%d",num[j]);
printf("\n");
f2=fopen("identifier","r");
k=0;
printf("The keywords and identifiersare:");
while((c=getc(f2))!=EOF)
{
if(c!=' ')str[k++]=c;
else
{
str[k]='\0';
keyword(str);
k=0;
}
}fclose(f2);
f3=fopen("specialchar","r");
printf("\nSpecial characters are");
while((c=getc(f3))!=EOF)
printf("%c",c);
printf("\n");
fclose(f3);
printf("Total no. of lines are:%d",lineno);
Output:
Enter the C program
a+b*c
Ctrl-D
%{
/* program to recognize a c program */
int COMMENT=0;
%}
identifier [a-zA-Z][a-zA-Z0-9]*
%%
{printf("\n\t%s is a KEYWORD",yytext);}
"/*" {COMMENT = 1;}
/*{printf("\n\n\t%s is a COMMENT\n",yytext);}*/
"*/" {COMMENT = 0;}
/* printf("\n\n\t%s is a COMMENT\n",yytext);}*/
{identifier}\( {if(!COMMENT)printf("\n\nFUNCTION\n\t%s",yytext);}
\{ {if(!COMMENT) printf("\n BLOCK BEGINS");}
\} {if(!COMMENT) printf("\n BLOCK ENDS");}
{identifier}(\[[0-9]*\])? {if(!COMMENT) printf("\n %s IDENTIFIER",yytext);}
\(
ECHO;
=
{if(!COMMENT)printf("\n\t%s is an ASSIGNMENT OPERATOR",yytext);}
\<= |
\>= |
\< |
== |
\> {if(!COMMENT) printf("\n\t%s is a RELATIONAL OPERATOR",yytext);}
%%
int main(int argc,char **argv)
{if (argc > 1)
{FILE *file;
file = fopen(argv[1],"r");
if(!file)
{printf("could not open %s \n",argv[1]);
exit(0);
}yyin = file;
}yylex();
printf("\n\n");
return 0;
}int yywrap()
{
return 0;
}
Input:
$vi var.c
#include<stdio.h>
main()
{
int a,b;
}
Output:
$lex lex.l
$cc lex.yy.c
$./a.out var.c
FUNCTION
main (
)
BLOCK BEGINS
int is a KEYWORD
a IDENTIFIER
b IDENTIFIER
BLOCK ENDS
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#define SIZE 128
#define NONE -1
#define EOS '\0'
#define NUM 257
#define KEYWORD 258
#define ID 259
#define DONE 260
#define MAX 999
char lexemes[MAX];
char buffer[SIZE];
int lastchar=-1;
int lastentry=0;
int tokenval=DONE;
int lineno=1;
int lookahead;
struct entry
{
char *lexptr;
int token;
}symtable[100];
struct entry
keywords[]={"if",KEYWORD,"else",KEYWORD,"for",KEYWORD,"int",KEYWORD,
"float",KEYWORD,"double",KEYWORD,"char",KEYWORD,"struct",KEYWORD,"ret
urn",KEYWORD,0,0};
void Error_Message(char *m)
{
fprintf(stderr,"line %d, %s \n",lineno,m);
exit(1);
}int look_up(char s[ ])
{
int k;
for(k=lastentry;k>0;k--)
if(strcmp(symtable[k].lexptr,s)==0)
return k;
return 0;
}int insert(char s[ ],int tok)
{
int len;
len=strlen(s);
if(lastentry+1>=MAX)
Error_Message("Symbpl table is full");
if(lastchar+len+1>=MAX)
}/*void Initialize()
{
struct entry *ptr;
for(ptr=keywords;ptr->token;ptr+1)
insert(ptr->lexptr,ptr->token);
}*/
int lexer()
{
int t;
int val,i=0;
while(1)
{
t=getchar();
if(t==' '||t=='\t');
else if(t=='\n')
lineno=lineno+1;
else if(isdigit(t))
{
ungetc(t,stdin);
scanf("%d",&tokenval);
return NUM;
}else if(isalpha(t))
{
while(isalnum(t))
{
buffer[i]=t;
t=getchar();
i=i+1;
if(i>=SIZE)
Error_Message("Compiler error");
}buffer[i]=EOS;
if(t!=EOF)
ungetc(t,stdin);
val=look_up(buffer);
if(val==0)
val=insert(buffer,ID);
tokenval=val;
return symtable[val].token;
}else if(t==EOF)
return DONE;
else
{
tokenval=NONE;
return t;
}
}
}void Match(int t)
{
if(lookahead==t)
lookahead=lexer();
else
Error_Message("Syntax error");
}void display(int t,int tval)
{
if(t=='+'||t=='-'||t=='*'||t=='/')
{
//void E();
switch(lookahead)
{
case ID : display(ID,tokenval);
Match(ID);
break;
{
int t;
F();
while(1)
{
switch(lookahead)
{
display(t,NONE);
continue;
default : return;
}
}
}void E()
{
int t;
T();
while(1)
{
switch(lookahead)
{
default : return;
}
}
}void parser()
{
lookahead=lexer();
while(lookahead!=DONE)
{
E();
Match(';');
}
}main()
{
char ans[10];
printf("\n Program for recursive decent parsing ");
printf("\n Enter the expression ");
printf("And place ; at the end\n");
printf("Press Ctrl-Z to terminate\n");
parser();
}
Output:Program for recursive decent parsing
Enter the expression And place ; at the end
Press Ctrl-Z to terminate
a+b*c;
Identifier: a
Identifier: b
Identifier: c
Arithmetic Operator: *
Arithmetic Operator: +
2*3;
Number: 2
Number: 3
Arithmetic Operator: *
+3;
line 5,Syntax error
Ctrl-Z
<parser.l>
%{
#include<stdio.h>
#include "y.tab.h"
%}
%%
[0-9]+ {yylval.dval=atof(yytext);
return DIGIT;
}
\n|.
return yytext[0];
%%
<parser.y>
%{
/*This YACC specification file generates the LALR parser for the program
considered in experiment 4.*/
#include<stdio.h>
%}
%union
{
double dval;
}%token <dval> DIGIT
%%
line: expr '\n'
{
printf("%g\n",$1);
}
;
expr: expr '+' term
{$$=$1 + $3 ;}
| term
;
| DIGIT
;
%%
int main()
{
yyparse();
}yyerror(char *s)
{
printf("%s",s);
}Output:
$lex parser.l
$yacc –d parser.y
$cc lex.yy.c y.tab.c –ll –lm
$./a.out
2+3
5.0000
5) Convert The BNF rules into Yacc form and write code to
generate abstract syntax tree.
<int.l>
%{#include"y.tab.h"
#include<stdio.h>
#include<string.h>
int LineNo=1;
%}
identifier [a-zA-Z][_a-zA-Z0-9]*
number [0-9]+|([0-9]*\.[0-9]+)
%%
if
return IF;
else
return ELSE;
while
return WHILE;
int |
char |
float
return TYPE;
{identifier} {strcpy(yylval.var,yytext);
return VAR;}
{number}
{strcpy(yylval.var,yytext);
return NUM;}
\< |
\> |
\>= |
\<= |
==
{strcpy(yylval.var,yytext);
return RELOP;}
[ \t] ;
\n LineNo++;
. return yytext[0];
%%
<int.y>
%{
#include<string.h>
#include<stdio.h>
struct quad
{
char op[5];
char arg1[10];
char arg2[10];
char result[10];
}QUAD[30];
struct stack
{
int items[100];
int top;
}stk;
int Index=0,tIndex=0,StNo,Ind,tInd;
extern int LineNo;
%}
%union
{
char var[10];
%%
| CONDST
| WHILEST
;DESCT: TYPE VARLIST
;VARLIST: VAR ',' VARLIST
| VAR
;ASSIGNMENT: VAR '=' EXPR{
strcpy(QUAD[Index].op,"=");
strcpy(QUAD[Index].arg1,$3);
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,$1);
strcpy($$,QUAD[Index++].result);
}
;CONDST: IFST{
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
}| IFST ELSEST
strcpy(QUAD[Index].op,"==");
strcpy(QUAD[Index].arg1,$3);
strcpy(QUAD[Index].arg2,"FALSE");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
}BLOCK {
strcpy(QUAD[Index].op,"GOTO");
strcpy(QUAD[Index].arg1,"");
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
};ELSEST: ELSE{
tInd=pop();
Ind=pop();
push(tInd);
sprintf(QUAD[Ind].result,"%d",Index);
}BLOCK{
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
};CONDITION: VAR RELOP VAR {AddQuadruple($2,$1,$3,$$);
StNo=Index-1;
}| VAR
| NUM
;
WHILEST: WHILELOOP{
Ind=pop();
sprintf(QUAD[Ind].result,"%d",StNo);
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
}
;WHILELOOP: WHILE '(' CONDITION ')' {
strcpy(QUAD[Index].op,"==");
strcpy(QUAD[Index].arg1,$3);
strcpy(QUAD[Index].arg2,"FALSE");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
}
BLOCK {
strcpy(QUAD[Index].op,"GOTO");
strcpy(QUAD[Index].arg1,"");
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
}
;
%%
extern FILE *yyin;
int main(int argc,char *argv[])
{
FILE *fp;
int i;
if(argc>1)
{
fp=fopen(argv[1],"r");
if(!fp)
{
}yyin=fp;
}yyparse();
--------------------");
for(i=0;i<Index;i++)
{
printf("\n\n");
return 0;
}void push(int data)
{
stk.top++;
if(stk.top==100)
{
int pop()
{
int data;
if(stk.top==-1)
{
{
strcpy(QUAD[Index].op,op);
strcpy(QUAD[Index].arg1,arg1);
strcpy(QUAD[Index].arg2,arg2);
sprintf(QUAD[Index].result,"t%d",tIndex++);
strcpy(result,QUAD[Index++].result);
}yyerror()
{
printf("\n Error on line no:%d",LineNo);
}
Input:
$vi test.c
main()
{
int a,b,c;
if(a<b)
{
a=a+b;
}while(a<b)
{
a=a+b;
}if(a<=b)
{
c=a-b;
}else
{
c=a+b;
}
}
Output:
$lex int.l
$yacc –d int.y
$gcc lex.yy.c y.tab.c –ll –lm
$./a.out test.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int label[20];
int no=0;
int main()
{
FILE *fp1,*fp2;
char fname[10],op[10],ch;
char operand1[8],operand2[8],result[8];
int i=0,j=0;
printf("\n Enter filename of the intermediate code");
scanf("%s",&fname);
fp1=fopen(fname,"r");
fp2=fopen("target.txt","w");
if(fp1==NULL || fp2==NULL)
{
{
fprintf(fp2,"\n");
fscanf(fp1,"%s",op);
i++;
if(check_label(i))
fprintf(fp2,"\nlabel#%d",i);
if(strcmp(op,"print")==0)
{
fscanf(fp1,"%s",result);
fprintf(fp2,"\n\t OUT %s",result);
}if(strcmp(op,"goto")==0)
{
fscanf(fp1,"%s %s",operand1,operand2);
}if(strcmp(op,"[]=")==0)
{
fscanf(fp1,"%s %s %s",operand1,operand2,result);
fprintf(fp2,"\n\t STORE %s[%s],%s",operand1,operand2,result);
}if(strcmp(op,"uminus")==0)
{
fscanf(fp1,"%s %s",operand1,result);
fprintf(fp2,"\n\t LOAD -%s,R1",operand1);
fprintf(fp2,"\n\t STORE R1,%s",result);
}switch(op[0])
{
fscanf(fp1,"%s %s %s",operand1,operand2,result);
fprintf(fp2,"\n \t LOAD %s,R0",operand1);
fprintf(fp2,"\n\t JGT %s,label#%s",operand2,result);
label[no++]=atoi(result);
break;
}
}fclose(fp2);
fclose(fp1);
fp2=fopen("target.txt","r");
if(fp2==NULL)
{
printf("%c",ch);
}while(ch!=EOF);
fclose(fp1);
return 0;
}int check_label(int k)
{
int i;
for(i=0;i<no;i++)
{
if(k==label[i])
return 1;
}return 0;
}Input:
$vi int.txt
=t1 2
+a[2] t2 t3
-a[2] t1 t2
/t3 t2 t2
uminus t2 t2
print t2
goto t2 t3
=t3 99
uminus 25 t2
*t2 t3 t3
uminus t1 t1
+t1 t3 t4
print t4
Output:
Enter filename of the intermediate code: int.txt
STORE t1,2
STORE a[0],1
STORE a[1],2
STORE a[2],3
LOAD t1,R0
LOAD 6,R1
ADD R1,R0
STORE R0,t3
LOAD a[2],R0
LOAD t2,R1
ADD R1,R0
STORE R0,t3
LOAD a[t2],R0
LOAD t1,R1
SUB R1,R0
STORE R0,t2
LOAD t3,R0
LOAD t2,R1
DIV R1,R0
STORE R0,t2
LOAD t2,R1
STORE R1,t2
LOAD t2,R0
JGT 5,label#11
Label#11: OUT t2
JMP t2,label#13
LOAD t2,R0
LOAD t3,R1
MUL R1,R0
STORE R0,t3
LOAD t1,R1
STORE R1,t1
LOAD t1,R0
LOAD t3,R1
ADD R1,R0
STORE R0,t4
OUT t4