CD File
CD File
Design and implement a lexical analyser for given language using C and
the lexical analyser should ignore redundant spaces, tabs, and new lines .
Ans:-
#include <stdio.h>
#include <ctype.h>
#include <string.h>
if (strcmp(str, keywords[i]) == 0)
return 1;
return 0;
if (!fp) {
return;
int i = 0;
if (isalnum(ch)) {
buffer[i++] = ch;
} else {
if (i > 0) {
buffer[i] = '\0';
if (isKeyword(buffer))
else if (isdigit(buffer[0]))
prin ("Number: %s\n", buffer);
else
i = 0;
fclose(fp);
INPUT
OUTPUT
Q2. Implementation of lexical analyzer using Lex Tool.
Ans:-
%{
#include <stdio.h>
%}
%op on noyywrap
%%
%%
int main() {
yylex();
return 0;
}
INPUT
OUTPUT
Q3. Generate YACC specification for a few syntactic categories.
Ans:-
%{
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
%}
%union {
%token INT
%%
program:
statement:
;
expression:
NUMBER { $$ = $1; }
yyerror("Division by zero");
} else {
$$ = $1 / $3;
%%
int main() {
yyparse();
return 0;
return 0;
}
INPUT
OUTPUT
Q4. WAP to find ℇ-closure of all states of any given NFA with ℇ transition.
Ans:-
#include <stdio.h>
#define MAX 10
int nfa[MAX][MAX];
int main() {
int i, j;
scanf("%d", &n);
prin ("Enter the epsilon transi ons (0 for no transi on, 1 for transi on):\n");
scanf("%d", &nfa[i][j]);
int closure[MAX] = {0}; // Ini alize closure array for each state
prin ("Epsilon-closure of state %d: { ", i);
epsilonClosure(i, closure);
if (closure[j]) {
prin ("}\n");
return 0;
}
INPUT
OUTPUT
Q5. WAP to convert NFA with ℇ transition to NFA without ℇ transition.
Ans:-
#include <stdio.h>
#define MAX 10
c[state] = 1;
closure(i, c);
stack[++top] = state;
visited[state] = 1;
int s = stack[top--];
result[s] = 1;
stack[++top] = i;
visited[i] = 1;
int main() {
scanf("%d", &n);
prin ("Enter epsilon transi ons matrix (0/1):\n");
scanf("%d", &e[i][j]);
scanf("%d", &nfa[i][sym][j]);
if (ec[j]) {
if (nfa[j][sym][k]) {
closure(k, temp);
if (temp[x]) reachable[x] = 1;
}
prin ("From %d on '%c' -> { ", i, 'a' + sym);
prin ("}\n");
return 0;
INPUT
OUTPUT
Q.6 WAP to convert NFA to DFA
Ans:-
#include <stdio.h>
void convert() {
int state = 0;
dfa[i][j] = state;
int main() {
scanf("%d", &n);
int k = 0;
do {
scanf("%d", &nfa[i][j][k]);
}
}
convert();
return 0;
INPUT
OUTPUT
Q7. WAP to minimize any given DFA.
Ans:-
#include <stdio.h>
#include <stdbool.h>
#define MAX 10
void minimize() {
if (group[i] == -1) {
group[i] = m++;
minDFA[group[i]][0] = dfa[i][0];
minDFA[group[i]][1] = dfa[i][1];
}
for (int j = i + 1; j < n; j++) {
if (areEquivalent(i, j)) {
group[j] = group[i];
if (group[i] != -1) {
void displayMinimizedDFA() {
int main() {
scanf("%d", &n);
scanf("%d", &dfa[i][j]);
}
minimize();
displayMinimizedDFA();
return 0;
INPUT
OUTPUT
Q8. Develop an operator precedence parser for a given language.
Ans:-
#include <stdio.h>
#include <string.h>
return 0;
char stack[100];
} else {
stack[++top] = expr[i];
int main() {
char expr[100];
prin ("Enter expression: ");
scanf("%s", expr);
parse(expr);
return 0;
INPUT
OUTPUT
Q9. WAP to find simulate First and Follow of any given
grammar.
Ans:-
#include <stdio.h>
#include <string.h>
#define MAX 10
char grammar[MAX][MAX];
int n;
if (strchr(set, c) == NULL) {
set[len] = c;
set[len + 1] = '\0';
void findFirst(char c) {
if (grammar[i][0] == c) {
findFirst(grammar[i][2]);
void findFollow(char c) {
if (grammar[i][j] == c) {
if (grammar[i][j + 1] != '\0' && grammar[i][j + 1] >= 'a' && grammar[i][j + 1] <= 'z') {
findFirst(grammar[i][j + 1]);
} else {
findFollow(grammar[i][0]);
int main() {
scanf("%d", &n);
scanf("%s", grammar[i]);
first[i][0] = '\0';
follow[i][0] = '\0';
findFirst(grammar[i][0]);
findFollow(grammar[i][0]);
}
printf("\nFirst sets:\n");
if (first[i][0] != '\0') {
printf(" }\n");
printf("\nFollow sets:\n");
if (follow[i][0] != '\0') {
printf(" }\n");
}
return 0;
INPUT
OUTPUT
Q10. Construct a recursive descent parser for an expression
Ans:-
#include <stdio.h>
#include <ctype.h>
int number() {
int val = 0;
while (isdigit(*p))
return val;
int factor() {
if (*p == '(') {
return val;
return number();
int term() {
char op = *p++;
int val2 = factor();
return val;
int expr() {
char op = *p++;
return val;
int main() {
char input[100];
p = input;
return 0;
INPUT OUTPUT
Q11. Construct a Shift Reduce parser for a given language.
Ans:-
#include <stdio.h>
#include <string.h>
void shift() {
stack[++top] = input[i++];
stack[top + 1] = '\0';
void reduce() {
if (top >= 2 && stack[top - 2] == 'E' && stack[top - 1] == '+' && stack[top] == 'E') {
top -= 2;
stack[top] = 'E';
} else if (top >= 2 && stack[top - 2] == 'E' && stack[top - 1] == '*' && stack[top] == 'E') {
top -= 2;
stack[top] = 'E';
} else if (top >= 2 && stack[top - 2] == '(' && stack[top - 1] == 'E' && stack[top] == ')') {
top -= 2;
stack[top] = 'E';
top--;
stack[top] = 'E';
i++;
} else {
return;
stack[top + 1] = '\0';
int main() {
scanf("%s", input);
strcat(input, "$");
while (1) {
reduce();
shift();
} else {
reduce();
printf("Accepted\n");
break;
}
if (i >= strlen(input) && strcmp(stack, "E") != 0) {
printf("Rejected\n");
break;
return 0;
INPUT
OUTPUT
Q12. WAP to perform loop unrolling.
Ans:-
#include <stdio.h>
int main() {
int a[100], n, i;
scanf("%d", &n);
scanf("%d", &a[i]);
for (i = 0; i <= n - 4; i += 4) {
a[i] *= 2;
a[i + 1] *= 2;
a[i + 2] *= 2;
a[i + 3] *= 2;
a[i] *= 2;
return 0;
INPUT OUTPUT
Q13. WAP to perform constant propagation.
Ans:-
#include <stdio.h>
#include <string.h>
int main() {
int val;
if (strcmp(op, var1) == 0)
else
return 0;
INPUT
OUTPUT
Q14. Implement intermediate code generation for simple
expressions.
Ans:-
#include <stdio.h>
int main() {
char a, b, c, d;
return 0;
INPUT
OUTPUT
Q15. Implement the back end of the compiler which takes the three-
address code and produces the 8086 assembly language instructions that
can be assembled and run using an 8086 assembler. the target assembly
instructions can be sample move, add, sub, jump etc.
Ans:-
#include <stdio.h>
int main() {
switch(op) {
case '+':
break;
case '-':
break;
case '*':
break;
case '/':
default:
break;
return 0;
INPUT
OUTPUT