0% found this document useful (0 votes)
491 views7 pages

Experiment 11:: AIM: WAP To Implement SLR Parser

The document describes implementing an SLR parser. It explains that the parsing table contains action and goto fields for each state, which are computed using algorithms that construct items and determine actions based on those items. If items conflict, the grammar is not SLR(1) and the algorithm fails. It also describes computing the goto transitions based on nonterminals. The C code implements this SLR parser with arrays to represent the parsing table and stack.

Uploaded by

akshat sharma
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
491 views7 pages

Experiment 11:: AIM: WAP To Implement SLR Parser

The document describes implementing an SLR parser. It explains that the parsing table contains action and goto fields for each state, which are computed using algorithms that construct items and determine actions based on those items. If items conflict, the grammar is not SLR(1) and the algorithm fails. It also describes computing the goto transitions based on nonterminals. The C code implements this SLR parser with arrays to represent the parsing table and stack.

Uploaded by

akshat sharma
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 7

EXPERIMENT 11:

AIM: WAP to implement SLR Parser.


THEORY:
The parsing table has two fields associated with each state in the DFA known as action and goto.
These are computed using the following algorithms:
Construct C ={I0,I1,…..In}, the collection of sets of LR(0) items for G’
State i is constructed from Ii. The parsing actions for state i are determined as follows:
If [A→α.aβ] is in Ii and goto(Ii, a) = Ij, then set action[i, a] to “shift j.” Here, a is
required to be a terminal
If [A→α.] is in Ii then set action [i, a][ to “reduce A→ α] for all a in FOLLOW(A),
here A may not be S’
If [S’ → S.] is in Ii, then set action[i, $] to “accept”
If any conflicting actions are generated by the above rules, we say the grammar is not SLR(1).
The algorithm fails to produce a parser in this case.
The goto transitions for state I are constructed for all non-terminals A using the rule: if goto(Ii,
A) = Ij, then goto[i, A] =j
All entries not defined by rules (2) and (3) are made “error”
The initial state of the parser is the one constructed from the set containing item [S’ → S]
Number of productions in the grammar from onwards and use the production number while
making a reduction entry

CODE:
#include<stdio.h>
#include<string.h>
int axn[][6][2] = {
{{100, 5}, {-1, -1}, {-1, -1}, {100, 4}, {-1, -1}, {-1, -1}},
{{-1, -1}, {100, 6}, {-1, -1}, {-1, -1}, {-1, -1}, {102, 102}},\
{{-1, -1}, {101, 2}, {100, 7}, {-1, -1}, {101, 2}, {101, 2}},
{{-1, -1}, {101, 4}, {101, 4}, {-1, -1}, {101, 4}, {101, 4}},
{{100, 5}, {-1, -1}, {-1, -1}, {100, 4}, {-1, -1}, {-1, -1}},
{{-1, -1}, {101, 6}, {101, 6}, {-1, -1}, {101, 6}, {101, 6}},
{{100, 5}, {-1, -1}, {-1, -1}, {100, 4}, {-1, -1}, {-1, -1}},
{{100, 5}, {-1, -1}, {-1, -1}, {100, 4}, {-1, -1}, {-1, -1}},]
{{-1, -1}, {100, 6}, {-1, -1}, {-1, -1}, {100, 1}, {-1, -1}},
{{-1, -1}, {101, 1}, {100, 7}, {-1, -1}, {101, 1}, {101, 1}},
{{-1, -1}, {101, 3}, {101, 3}, {-1, -1}, {101, 3}, {101, 3}},
{{-1, -1}, {101, 5}, {101, 5}, {-1, -1}, {101, 5}, {101, 5}}
};
int gotot[12][3] =
{ 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 2, 3, -1, -1, -1,
-1, 9, 3, -1, -1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
int a[10];
char b[10];
int top = -1, btop = -1, I;
Void push (int k){
if (top < 9)
a[++top] = k;}
Void pushb (char k){
if (btop < 9)
b[++btop] = k; }
char TOS (){ return a[top];}
void pop (){
if (top >= 0)
top--;}
void popb (){
if (btop >= 0)
b[btop--] = '\0'; }
void display (){
for (i = 0; i <= top; i++)
printf ("%d%c", a[i], b[i]);}
void display1 (char p[], int m){
int l;
printf ("\t\t");
for (l = m; p[l] != '\0'; l++)
printf ("%c", p[l]);
printf ("\n");}
void error (){
printf ("Syntax Error");}
void reduce (int p){
int len, k, ad;
char src, *dest;
switch (p) {
case 1: dest = "E+T";
src = 'E';
break;
case 2: dest = "T";
src = 'E';
break;
case 3: dest = "T*F";
src = 'T';
break;
case 4: dest = "F";
src = 'T';
break;
case 5: dest = "(E)";
src = 'F';
break;
case 6: dest = "i";
src = 'F';
break;
default: dest = "\0";
src = '\0';
Break;
}
for (k = 0; k < strlen (dest); k++) {
pop ();
popb (); }
pushb (src);
switch (src) {
case 'E': ad = 0;
break;
case 'T': ad = 1;
break;
case 'F': ad = 2;
break;
default: ad = -1;
break;
}
push (gotot[TOS ()][ad]);
}
Int main ()
{
int j, st, ic;
char ip[20] = "\0", an;
printf ("Enter any String\n");
scanf ("%s", ip);
push (0);
display ();
printf ("\t%s\n", ip);
for (j = 0; ip[j] != '\0';)
{
st = TOS ();
an = ip[j];
if (an >= 'a' && an <= 'z')
ic = 0;
else if (an == '+')
ic = 1;
else if (an == '*')
ic = 2;
else if (an == '(')
ic = 3;
else if (an == ')')
ic = 4;
else if (an == '$')
ic = 5;
else{
error ();
break;}
if (axn[st][ic][0] == 100){
push b (an);
push (axn[st][ic][1]);
display ();
j++;
display1 (ip, j);}
if (axn[st][ic][0] == 101)
{
reduce (axn[st][ic][1]);
display ();
display1 (ip, j);
}
if (axn[st][ic][1] == 102)
{ printf ("Given String is accepted \n");
break;
} }
return 0;

}
OUTPUT:
RESULT:
The program was successfully written and created in C.

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy