LL1文法 i+i*i 分析

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef struct{
    char *base;
    char *top;
}Sqstack;

//手动构造预测分析表  42个字符串
char* str[6][7]={" " , "i"  , "+" , "*" , "(" , ")" , "#" ,
                 "E" , "TH" , " " , " " , "TH" , " " , " ",
                 "H" , " " , "+TH" , " " ," " , "e" ,"e",
                 "T" , "FY" , " " , " " , "FY" , " " , " ",
                 "Y" , " " , "e" , "*FY" , " " , "e" , "e",
                 "F" , "i" , " " , " " , "(E)" , " " , " "
                };

/*初始化顺序栈*/
void Creatstack(Sqstack &S)
{
    S.base = new char[MAXSIZE];/*base指向第0个元素*/
    S.top = S.base;
}

/*判断栈是否为空*/
int stackempty(Sqstack &S)
{
    if(S.base == S.top)
        return 1;
    else
        return 0;
}

/*入栈*/
void push(Sqstack &S,char e)
{
    *S.top++ = e;
}

/*出栈*/
void pop(Sqstack &S)
{
    --S.top;
}

/*获取栈顶元素*/
char gettop(Sqstack &S)
{
    --S.top;
    return *S.top;

}

/*把栈里的内容输出*/
void showstack(Sqstack &S)
{
    int i = 0;//记步
    while(S.top != S.base)
    {
        printf("%c",*S.base);
        S.base++;
        i++;
    }
    //把栈还原成原来的样子
    while(i != 0)
    {
        S.base--;
        i--;
    }
}

void showinput(char *p)
{
    int i = 0;
    while(*p != '\0')
    {
        printf("%c ",*p);
        p++;
        i++;
    }
    //将p指向原来的位置
    while(i != 0)
    {
        p--;
        i--;
    }
}

void main()
{
    int test = 0;
    //建立栈
    Sqstack S;
    char ch;
    char *p;
    char *s;
    int i,j;
    int a,b;
    int z;
    int k;
    //要验证的i+i*i
    char *input = "i+i*i#";
    p = input;
    Creatstack(S);

    //将#入栈
    push(S,'#');
    //文法开始符入栈
    push(S,'E');
    
    while(S.base != S.top)
    {

        showstack(S);
        printf("                  ");
        showinput(p);
        printf("                  ");
        
        //找栈顶元素的和输入串的首元素
        ch = gettop(S);
        //获取之后还要还原
        S.top++;
        
        if(ch == *p && *p != '\0')
        {
            pop(S);
            p++;
            printf("匹配成功");
            printf("\n");
        }
        
        else{
                for(i = 0;i < 6;i++)
                {
                    
                    if(*str[i][0] == ch) 
                    {
                        a = i;
                    }
                }
                
                for(j = 0;j < 7;j++)
                {
                    
                    if(*str[0][j] == *p) 
                    {
                        b = j;            
                    }
                }
                
                if(str[a][b] == "e")
                {
                    pop(S);
                }
                else
                {
                    pop(S);
                    //逆序
                    s = str[a][b];
                    z = 0;
                    while(*s != '\0')
                    {
                        s++;
                        z++;
                    }
                    s--;
                    //z--;
                    while(z != 0)
                    {
                        push(S,*s);
                        s--;
                        z--;
                    }
                    
                }
                printf("%c -> %s \n",ch,str[a][b]);//find  
        }
    }
}

 

posted @ 2020-04-27 09:58  军临天下jyj  阅读(868)  评论(0编辑  收藏  举报