ECS 653 (Programs)
ECS 653 (Programs)
1
} else if (code[i] == '>' || code[i] == '<' || code[i] == '=' || code[i] == '!') {
if (code[i+1] == '=') {
printf("Operator: %c=\n", code[i]);
i++;
} else {
printf("Operator: %c\n", code[i]);
}
} else if (code[i] == '(' || code[i] == ')' || code[i] == '{' || code[i] == '}' || code[i] == ';') {
printf("Punctuation: %c\n", code[i]);
} else if (code[i] == '+' || code[i] == '-' || code[i] == '*' || code[i] == '/') {
printf("Operator: %c\n", code[i]);
}
}
i++;
}
int main() {
char code[200];
2
return 0;
}
Program 2:
Implementation of LEXICAL ANALYZER for ARITHMETIC
EXPRESSION
#include <stdio.h>
#include <ctype.h>
#include <string.h>
3
continue;
}
4
break;
default:
printf("Unknown symbol: %c\n", ch);
}
i++;
}
}
}
int main() {
char input[200];
return 0;
}
5
Program 3: Construction of NFA from REGULAR
EXPRESSION
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
State *start;
State *end;
} NFA;
int stateCount = 0;
6
State *end = createState('\0');
start->symbol = symbol;
start->next1 = end;
nfa.start = start;
nfa.end = end;
return nfa;
}
7
start->next2 = end;
nfa.end->symbol = '\0';
nfa.end->next1 = nfa.start;
nfa.end->next2 = end;
NFA result = { start, end };
return result;
}
NFA stack[MAX];
int top = -1;
NFA pop() {
return stack[top--];
}
if (state->next1) {
printf("State %d --[%c]--> State %d\n", state->id, state->symbol ? state->symbol : 'ε', state-
>next1->id);
printNFA(state->next1, visited);
}
if (state->next2) {
printf("State %d --[%c]--> State %d\n", state->id, state->symbol ? state->symbol : 'ε', state-
>next2->id);
printNFA(state->next2, visited);
}
8
}
int main() {
char postfix[100];
printf("Enter Regular Expression in Postfix: ");
scanf("%s", postfix);
9
printf("Final State: %d\n", finalNFA.end->id);
return 0;
}
Program 4:
Construction of DFA from NFA
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
#define SYMBOLS 2 // for 'a' and 'b'
10
int nfa_states = 0;
int dfa_states = 0;
typedef struct {
int states[MAX];
int count;
} StateSet;
11
int s = closure.states[i];
for (int j = 0; j < nfa_states; j++) {
if (nfa_epsilon[s][j] && !isStateInSet(closure, j)) {
addState(&closure, j);
changed = 1;
}
}
}
}
return closure;
}
12
int findSetIndex(StateSet dfa[], int count, StateSet set) {
for (int i = 0; i < count; i++) {
if (areSetsEqual(dfa[i], set)) return i;
}
return -1;
}
void constructDFA() {
StateSet dfa[MAX];
int dfa_trans[MAX][SYMBOLS];
int marked[MAX] = {0};
int dfa_count = 0;
int i = 0;
while (i < dfa_count) {
marked[i] = 1;
for (int s = 0; s < SYMBOLS; s++) {
StateSet temp = move(dfa[i], s);
StateSet closure = epsilonClosure(temp);
int idx = findSetIndex(dfa, dfa_count, closure);
if (idx == -1 && closure.count > 0) {
dfa[dfa_count] = closure;
dfa_trans[i][s] = dfa_count;
dfa_count++;
} else {
dfa_trans[i][s] = idx;
}
13
}
i++;
}
int main() {
printf("Enter number of NFA states: ");
scanf("%d", &nfa_states);
printf("Enter transitions for NFA (for each state and input symbol a/b):\n");
for (int i = 0; i < nfa_states; i++) {
for (int s = 0; s < SYMBOLS; s++) {
int k, t;
14
printf("From q%d on '%c', number of transitions: ", i, symbols[s]);
scanf("%d", &k);
printf("Enter destination states: ");
for (int j = 0; j < k; j++) {
scanf("%d", &t);
nfa[i][s][t] = 1;
}
}
}
constructDFA();
return 0;
}
15
Input:
Output:
Program 5:
Implementation of SHIFT REDUCE PARSING ALGORITHM
#include <stdio.h>
#include <string.h>
16
char input[100];
char stack[100];
int top = -1;
int i = 0;
void pop() {
if (top >= 0)
top--;
stack[top + 1] = '\0';
}
void printStack() {
for (int j = 0; j <= top; j++)
printf("%c", stack[j]);
}
void reduce() {
if (top >= 2) {
// E → E+E or E*E
if ((stack[top] == 'E') &&
(stack[top - 1] == '+' || stack[top - 1] == '*') &&
(stack[top - 2] == 'E')) {
pop();
pop();
pop();
push('E');
printf("REDUCE E → E%cE\n", stack[top]);
17
}
}
// E → (E)
if (top >= 2 && stack[top] == ')' && stack[top - 1] == 'E' && stack[top - 2] == '(') {
pop();
pop();
pop();
push('E');
printf("REDUCE E → (E)\n");
}
// E → id
if (top >= 1 && stack[top] == 'd' && stack[top - 1] == 'i') {
pop(); // d
pop(); // i
push('E');
printf("REDUCE E → id\n");
}
}
void shift() {
printf("SHIFT: %c\n", input[i]);
push(input[i]);
i++;
}
int main() {
printf("Enter the input string (e.g., id+id*id): ");
scanf("%s", input);
18
printf("\nSTACK\t\tINPUT\t\tACTION\n");
printf("-----\t\t-----\t\t------\n");
// Final check
if (stack[0] == 'E' && stack[1] == '\0')
printf("Parsing successful: input accepted.\n");
else
printf("Parsing failed: input rejected.\n");
return 0;
}
Input:
19
Output:
Program 6:
Implementation of OPERATOR PRECEDENCE PARSER
#include <stdio.h>
#include <string.h>
20
void shift() {
stack[++top] = input[i++];
stack[top + 1] = '\0';
}
void reduce() {
if (stack[top] == 'i') {
stack[top] = 'E'; // id to E
} else if (stack[top] == 'E' && (stack[top - 1] == '+' || stack[top - 1] == '*') && stack[top - 2] == 'E')
{
top -= 2;
stack[top] = 'E'; // E+E or E*E to E
}
}
int main() {
printf("Enter the input (e.g., i+i*i): ");
scanf("%s", input);
strcat(input, "$");
stack[0] = '$';
top = 0;
printf("\nStack\tInput\tAction\n");
while (i < strlen(input)) {
printf("%s\t%s\t", stack, &input[i]);
21
shift();
printf("Shift\n");
}
}
Input:
Output:
Program 7:
Implementation of RECURSIVE DESCENT PARSER
22
#include <stdio.h>
#include <string.h>
char input[100];
int i = 0;
void E();
void EPrime();
void T();
void TPrime();
void F();
void E() {
T();
EPrime();
}
void EPrime() {
if (input[i] == '+') {
i++;
T();
EPrime();
}
23
}
void T() {
F();
TPrime();
}
void TPrime() {
if (input[i] == '*') {
i++;
F();
TPrime();
}
}
void F() {
if (input[i] == '(') {
i++;
E();
match(')');
} else if (input[i] == 'i') {
i++;
} else {
printf("Invalid symbol '%c'\n", input[i]);
exit(1);
}
}
int main() {
printf("Enter the expression: ");
scanf("%s", input);
E();
24
if (input[i] == '\0')
printf("Accepted\n");
else
printf("Rejected at %c\n", input[i]);
return 0;
}
Program 8:
Implementation of CODE OPTIMIZATION TECHNIQUES
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char expr[100];
int a, b, res;
char op;
switch (op) {
case '+': res = a + b; break;
case '*': res = a * b; break;
case '-': res = a - b; break;
case '/': res = a / b; break;
default: printf("Unsupported op\n"); exit(1);
25
}
return 0;
}
Program 9:
Implementation of CODE GENERATOR
#include <stdio.h>
int main() {
printf("Expression: a = b + c * d\n\n");
// Three Address Code
printf("=== Three Address Code ===\n");
printf("t1 = c * d\n");
printf("t2 = b + t1\n");
printf("a = t2\n\n");
// Postfix Code
printf("=== Postfix Code ===\n");
printf("b c d * + a =\n\n");
// Intermediate Code (Quadruples)
printf("=== Intermediate Code (Quadruples) ===\n");
26
printf("Op\tArg1\tArg2\tResult\n");
printf("*,\tc,\td,\tt1\n");
printf("+,\tb,\tt1,\tt2\n");
printf("=,\tt2,\t-,\ta\n\n");
// Assembly-like Code
printf("=== Assembly-like Code ===\n");
printf("MOV R1, c\n");
printf("MUL R1, d\n");
printf("MOV R2, b\n");
printf("ADD R2, R1\n");
printf("MOV a, R2\n");
return 0;
}
27