CDC_LAB_All
CDC Lab Codes — Concise (Paper-Writing Style)
Lab 1: Valid Comment Checker
#include<stdio.h>
#include<string.h>
int main()
{
char c[30]; int a=0,i;
printf("Enter comment: ");
gets(c);
if(c[0]=='/' && c[1]=='/')
printf("It is a comment");
else if(c[0]=='/' && c[1]=='*')
{
for(i=2;c[i]!='\0';i++)
if(c[i]=='*' && c[i+1]=='/') { a=1; break; }
printf(a ? "It is a comment" : "It is not a comment");
}
else
printf("It is not a comment");
return 0;
}
Lab 2: Recognize Strings under a*, a*b+, abb
#include<stdio.h>
#include<stdlib.h>
int main()
{
char s[20], c; int state=0, i=0;
printf("Enter a string: ");
gets(s);
while(s[i]!='\0')
{
c=s[i++];
switch(state)
{
case 0: state = (c=='a')?1:(c=='b')?2:6; break;
case 1: state = (c=='a')?3:(c=='b')?4:6; break;
case 2: state = (c=='b')?2:6; break;
case 3: state = (c=='a')?3:(c=='b')?2:6; break;
case 4: state = (c=='b')?5:6; break;
case 5: state = (c=='b')?2:6; break;
}
if(state==6) { printf("%s is not recognized", s); return 0; }
}
if(state==1) printf("%s accepted under 'a'", s);
else if(state==2||state==4) printf("%s accepted under 'a*b+'", s);
else if(state==5) printf("%s accepted under 'abb'", s);
return 0;
}
Lab 3: Valid Identifier Checker
#include<stdio.h>
#include<ctype.h>
int main()
{
char a[10]; int flag=1, i=1;
printf("Enter an identifier: ");
gets(a);
if(!(isalpha(a[0]) || a[0]=='_')) flag=0;
while(flag && a[i]!='\0')
{
if(!isalnum(a[i]) && a[i]!='_') flag=0;
i++;
}
printf(flag ? "Valid identifier" : "Not a valid identifier");
return 0;
}
Lab 4: Lexical Analyzer
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int isKeyword(char b[])
{
char kw[32][10]={"auto","break","case","char","const","continue","default","do",
"double","else","enum","extern","float","for","goto","if","int","long","register",
"return","short","signed","sizeof","static","struct","switch","typedef","union",
"unsigned","void","volatile","while"};
int i;
for(i=0;i<32;i++) if(strcmp(kw[i],b)==0) return 1;
return 0;
}
int main()
{
char ch, buf[15], op[]="+-*/%=";
FILE *fp=fopen("aa.txt","r");
int i,j=0;
if(!fp){ printf("error opening file"); return 0; }
while((ch=fgetc(fp))!=EOF)
{
for(i=0;i<6;i++) if(ch==op[i]) printf("%c is operator\n",ch);
if(isalnum(ch)) buf[j++]=ch;
else if((ch==' '||ch=='\n') && j!=0)
{
buf[j]='\0'; j=0;
printf(isKeyword(buf) ? "%s is keyword\n" : "%s is identifier\n", buf);
}
}
fclose(fp);
return 0;
}
Lab 5: FIRST of a Grammar
#include<stdio.h>
#include<ctype.h>
int n;
char prod[10][10], result[20];
void addTo(char R[], char v)
{
int k; for(k=0;R[k]!='\0';k++) if(R[k]==v) return;
R[k]=v; R[k+1]='\0';
}
void FIRST(char *R, char c)
{
int i,j,k; char sub[20]; int eps;
R[0]='\0';
if(!isupper(c)) { addTo(R,c); return; }
for(i=0;i<n;i++)
{
if(prod[i][0]==c)
{
if(prod[i][2]=='$') addTo(R,'$');
else
{
j=2;
while(prod[i][j]!='\0')
{
eps=0; FIRST(sub, prod[i][j]);
for(k=0;sub[k]!='\0';k++)
{
addTo(R, sub[k]);
if(sub[k]=='$') eps=1;
}
if(!eps) break;
j++;
}
}
}
}
}
int main()
{
int i; char ch, choice;
printf("No. of productions: "); scanf(" %d", &n);
for(i=0;i<n;i++){ printf("Production %d: ",i+1); scanf(" %s", prod[i]); }
do
{
printf("Find FIRST of: "); scanf(" %c", &ch);
FIRST(result, ch);
printf("FIRST(%c) = { ", ch);
for(i=0;result[i]!='\0';i++) printf("%c ", result[i]);
printf("}\n");
printf("Continue(y/n)? "); scanf(" %c", &choice);
} while(choice=='y'||choice=='Y');
return 0;
}
Lab 6: FOLLOW of a Grammar
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int n; char a[10][10], result[20];
void addTo(char R[], char v)
{
int k; for(k=0;R[k]!='\0';k++) if(R[k]==v) return;
R[k]=v; R[k+1]='\0';
}
void first(char *R, char c);
void follow(char *R, char c)
{
int i,j,k; char sub[20];
R[0]='\0';
if(a[0][0]==c) addTo(R,'$');
for(i=0;i<n;i++)
for(j=2;j<(int)strlen(a[i]);j++)
if(a[i][j]==c)
{
if(a[i][j+1]!='\0') first(sub, a[i][j+1]);
else if(c!=a[i][0]) follow(sub, a[i][0]);
for(k=0;sub[k]!='\0';k++) addTo(R, sub[k]);
}
}
void first(char *R, char c)
{
int k;
if(!isupper(c) && c!='#') { addTo(R,c); return; }
for(k=0;k<n;k++)
if(a[k][0]==c)
{
if(a[k][2]=='#') follow(R, a[k][0]);
else if(!isupper(a[k][2])) addTo(R, a[k][2]);
else first(R, a[k][2]);
}
}
int main()
{
int i, choice; char c;
printf("No. of productions: "); scanf("%d", &n);
for(i=0;i<n;i++) scanf("%s", a[i]);
do
{
printf("Find FOLLOW of: "); scanf(" %c", &c);
follow(result, c);
printf("FOLLOW(%c) = { ", c);
for(i=0;result[i]!='\0';i++) printf("%c ", result[i]);
printf("}\n");
printf("Continue(1/0)? "); scanf("%d", &choice);
} while(choice==1);
return 0;
}
Lab 7: LL(1) Parsing (Table-Driven)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s[20], stack[20];
int main()
{
char m[5][6][4]={"tb"," "," ","tb"," "," "," ","+tb"," "," ","n","n",
"fc"," "," ","fc"," "," "," ","n","*fc"," "," ","n","n",
"i"," "," ","(e)"," "," "};
int size[5][6]={2,0,0,2,0,0, 0,3,0,0,1,1, 2,0,0,2,0,0,
0,1,3,0,1,1, 1,0,0,3,0,0};
int i,j,k,n,str1,str2;
printf("Enter input string: "); scanf("%s", s);
strcat(s,"$");
n=strlen(s);
stack[0]='$'; stack[1]='e'; i=1; j=0;
printf("Stack\t\tInput\n");
while(stack[i]!='$' && s[j]!='$')
{
if(stack[i]==s[j]) { i--; j++; }
switch(stack[i]) { case 'e':str1=0;break; case 'b':str1=1;break;
case 't':str1=2;break; case 'c':str1=3;break; case 'f':str1=4;break; }
switch(s[j]) { case 'i':str2=0;break; case '+':str2=1;break;
case '*':str2=2;break; case '(':str2=3;break;
case ')':str2=4;break; case '$':str2=5;break; }
if(m[str1][str2][0]=='\0') { printf("ERROR"); exit(0); }
else if(m[str1][str2][0]=='n') i--;
else if(m[str1][str2][0]=='i') stack[i]='i';
else
{
for(k=size[str1][str2]-1;k>=0;k--) { stack[i]=m[str1][str2][k]; i++; }
i--;
}
for(k=0;k<=i;k++) printf("%c",stack[k]);
printf("\t\t");
for(k=j;k<=n;k++) printf("%c",s[k]);
printf("\n");
}
printf("SUCCESS");
return 0;
}
Lab 8: Shift Reduce Parser
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char ip[15], stack[15]; int ip_ptr=0, st_ptr=0, len;
void check()
{
char t = stack[st_ptr];
if(t=='a' || t=='b')
{
stack[st_ptr]='E';
printf("$%s\t\t%s\t\tE->%c\n", stack, ip+ip_ptr, t);
}
if(strcmp(stack,"E+E")==0 || strcmp(stack,"E*E")==0 || strcmp(stack,"E/E")==0)
{
char op = stack[1];
strcpy(stack, "E"); st_ptr=0;
printf("$%s\t\t%s\t\tE->E%cE\n", stack, ip+ip_ptr, op);
}
if(strcmp(stack,"E")==0 && ip_ptr==len)
{
printf("$%s\t\t%s\t\tACCEPT\n", stack, ip+ip_ptr);
exit(0);
}
}
int main()
{
int i;
printf("Grammar: E->E+E | E*E | E/E | a | b\n");
printf("Enter input string: "); scanf("%s", ip);
len=strlen(ip);
printf("Stack\t\tInput\t\tAction\n");
for(i=0;i<len;i++)
{
stack[st_ptr]=ip[ip_ptr];
stack[st_ptr+1]='\0';
ip_ptr++;
printf("$%s\t\t%s\t\tshift %c\n", stack, ip+ip_ptr, ip[ip_ptr-1]);
check();
st_ptr++;
}
printf("REJECT");
return 0;
}
Lab 9a: Intermediate Code Generation
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int j=0, tmpch=90;
char str[100], left[15], right[15];
struct { int pos; char op; } k[15];
void findopr()
{
int i; char ops[]="/*+-";
int oi;
for(oi=0; ops[oi]; oi++)
for(i=0;str[i]!='\0';i++)
if(str[i]==ops[oi]) { k[j].pos=i; k[j++].op=ops[oi]; }
}
void fleft(int x)
{
int w=0, flag=0; x--;
while(x!=-1 && str[x]!='+' && str[x]!='*' && str[x]!='-' && str[x]!='/' && str[x]!='=')
{
if(str[x]!='$' && !flag) { left[w++]=str[x]; left[w]='\0'; str[x]='$'; flag=1; }
x--;
}
}
void fright(int x)
{
int w=0, flag=0; x++;
while(str[x]!='\0' && str[x]!='+' && str[x]!='*' && str[x]!='-' && str[x]!='/' && str[x]!='=')
{
if(str[x]!='$' && !flag) { right[w++]=str[x]; right[w]='\0'; str[x]='$'; flag=1; }
x++;
}
}
int main()
{
int i;
printf("Enter expression: "); scanf("%s", str);
findopr();
for(i=0;i<j;i++)
{
fleft(k[i].pos); fright(k[i].pos);
str[k[i].pos] = tmpch--;
printf("t%d := %s %c %s\n", 90-tmpch, left, k[i].op, right);
}
return 0;
}
Lab 9b: Final (Target) Code Generation
#include<stdio.h>
#include<string.h>
int main()
{
char op[2], arg1[5], arg2[5], result[5];
FILE *fp1=fopen("input.txt","r");
FILE *fp2=fopen("output.txt","w");
while(fscanf(fp1,"%s%s%s%s",op,arg1,arg2,result)!=EOF)
{
if(strcmp(op,"=")==0)
{
fprintf(fp2,"MOV R0,%s\n", arg1);
fprintf(fp2,"MOV %s,R0\n", result);
continue;
}
char *ins = strcmp(op,"+")==0 ? "ADD" :
strcmp(op,"-")==0 ? "SUB" :
strcmp(op,"*")==0 ? "MUL" : "DIV";
fprintf(fp2,"MOV R0,%s\n", arg1);
fprintf(fp2,"%s R0,%s\n", ins, arg2);
fprintf(fp2,"MOV %s,R0\n", result);
}
fclose(fp1); fclose(fp2);
return 0;
}
</file_text>