zoukankan      html  css  js  c++  java
  • 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 != '')
        {
            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 != '')
            {
                pop(S);
                p++;
                printf("匹配成功");
                printf("
    ");
            }
            
            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 != '')
                        {
                            s++;
                            z++;
                        }
                        s--;
                        //z--;
                        while(z != 0)
                        {
                            push(S,*s);
                            s--;
                            z--;
                        }
                        
                    }
                    printf("%c -> %s 
    ",ch,str[a][b]);//find  
            }
        }
    }
  • 相关阅读:
    上海 政府性 常用网站
    linux 如何显示一个文件的某几行(中间几行)
    oracle 替换其中部分内容
    notepad++ 开始和结尾
    ll -d
    Mongodb总结3-稍微封装一下
    Mongodb总结3-稍微封装一下
    Mongodb总结2-Java版本的HelloWorld-CRUD例子
    Mongodb总结2-Java版本的HelloWorld-CRUD例子
    Mongodb总结1-启动和Shell脚本
  • 原文地址:https://www.cnblogs.com/lintianxiajun/p/12784734.html
Copyright © 2011-2022 走看看