Tuesday, October 2, 2018

Write a C program for constructing of LL (1) parsing.

Q. Perform LL(1) Parsing for the given grammar
 b->tb
t->cf
f->i
i->@
c->f|@
b->+tb
f->id
t->*ft

Click here for demo

#include<stdio.h>
#include<conio.h>
#include<string.h>
char s[20],stack[20];
void main()
{
    char m[5][6][3]={"tb"," "," ","tb"," "," "," ","+tb"," "," ","n","n","fc"," "," ","fc"," "," "," ","n","*fc"," a ","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;
    clrscr();
    printf("\n Enter the input string: ");
    scanf("%s",s);
    strcat(s,"$");
    n=strlen(s);
    stack[0]='$';
    stack[1]='e';
    i=1;
    j=0;
    printf("\nStack Input\n");
    printf("__________________\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("\nERROR");
            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(" ");
        for(k=j;k<=n;k++)
        printf("%c",s[k]);
        printf(" \n ");
       
    }
    printf("\n SUCCESS");
    getch();
   
}

2 comments: