22bce0698
22bce0698
Q1.
#include <stdio.h>
#include <string.h>
struct ProductionRule
{
char left[10];
char right[10];
};
int main()
{
char input[20], stack[50], temp[50], ch[2], *token1, *token2, *substring;
int i, j, stack_length, substring_length, stack_top, rule_count = 0;
struct ProductionRule rules[10];
stack[0] = '\0';
i = 0;
printf("\n%-15s%-15s%-15s\n", "Stack", "Input", "Action");
while (1)
{
if (i < strlen(input))
{
ch[0] = input[i];
ch[1] = '\0';
i++;
strcat(stack, ch);
printf("%-15s", stack);
for (int k = i; k < strlen(input); k++)
{
printf("%c", input[k]);
}
if (i == strlen(input))
{
printf("ε");
}
printf("%-15sShift %s\n", "", ch);
}
printf("%-15s", stack);
for (int k = i; k < strlen(input); k++)
{
printf("%c", input[k]);
}
if (i == strlen(input))
{
printf("ε");
}
printf("%-15sReduce %s->%s\n", "", rules[j].left, rules[j].right);
j = -1;
}
}
if (strcmp(stack, rules[0].left) == 0 && i == strlen(input))
{
printf("Accepted");
break;
}
if (i == strlen(input))
{
printf("Not accepted\n");
break;
}
}
return 0;
}
OUTPUT
Q2.
CODE:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool isOperator(char c) {
return (c == '+' || c == '*' || c == '(' || c == ')');
}
bool isOperand(char c) {
return (c == 'i' || c == 'd');
}
bool checkPrecedenceTable(char a, char b) {
if (a == '+' && b == '*') return true;
if (a == '+' && b == '+') return false;
if (a == '*' && b == '*') return false;
if (a == '(' && b == ')') return true;
return false;
}
bool isOperatorPrecedenceGrammar(const string& expression) {
stack<char> s;
for (int i = 0; i < expression.length(); i++) {
char current = expression[i];
if (isOperator(current)) {
if (!s.empty() && isOperator(s.top())) {
if (!checkPrecedenceTable(s.top(), current)) {
return false;
}
}
} else if (isOperand(current)) {
continue;
} else if (current == ')') {
while (!s.empty() && s.top() != '(') {
s.pop();
}
if (!s.empty() && s.top() == '(') {
s.pop();
}
}
s.push(current);
}
return true;
}
int main() {
string expression;