zoukankan      html  css  js  c++  java
  • 12-16 实验四 递归下降语法分析程序设计

    对于给定的文法G[E],消除左递归后的文法是:

    E→TE'

    E'→+TE'|-TE'|ε

    T→FT'

    T'→*FT'|/FT'|ε

    F→(E)|i

     源程序:

    #include<stdio.h>
    char curr;
    char LL1[1000];
    int N=-1;
     
    void Top();
    void Top1();
    void Top2();
    void top();
    void top1();
    void error();
    void scaner();
     
    void main()
    {    char ch;
        int i=0;
        printf("请输入需要分析的curr语法:(以#结束)
    ");
        do{
            scanf("%c",&ch);
            LL1[i] = ch;
            i++;
        }while(ch != '#');
        scaner();
        Top1();
        if(curr == '#')
            printf("成功!
    ");
        else{
            printf("文法有误!!
    ");
            error();
        }
     
    }
     
    void scaner(){   
     
        N++;
        if(LL1[N] == ' '){
            N++;
        }else{
            curr = LL1[N];
        }
    }
     
    void Top(){
        Top2();
        top();
    }
     
    void Top1(){
        Top();
        top1();
    }
     
    void Top2(){
        if(curr == '('){
            scaner();
            Top1();
            if(curr == ')'){
                scaner();
            }
            else
            {
                error();
            }
            else
            {
            
            while(1){
                if(curr >= 'a' && curr<='z' || curr >= 'A' && curr <= 'Z' || curr >= '0' && curr <= '9'){
                    scaner();
                }
                else
                {
                    break;
                }
            }
        }
    }
     
    void top(){
        if(curr == '*'){
            scaner();
            Top2();
            Top();
        }else if(curr == '/'){
            scaner();
            Top2();
            Top();
        }else if(LL1[N+1] == '#' || LL1[N+1] == '+' || LL1[N+1] == '/' || LL1[N+1] == '*' || LL1[N+1] == '-'){
            if(LL1[N] != '(' && LL1[N] != ')')
            error();
        }
    }
     
    void top1(){
        if(curr == '+'){
            scaner();
            Top();
            top1();
        }
        else if(curr == '-'){
            scaner();
            Top();
            top1();
        }else if(LL1[N+1] == '#' || LL1[N+1] == '+' || LL1[N+1] == '/' || LL1[N+1] == '*' || LL1[N+1] == '-'){
            if(LL1[N] != '(' && LL1[N] != ')')
            error();
        }
    }
     
    void error(){
        printf("%d %c之后的文法有错!
    ",N,curr);
    }
      

    运行结果:

  • 相关阅读:
    Tennix — 开源的网球游戏
    Tile Racer — 3D 赛车游戏
    51CTO网管生活
    分割图片的例子 回复 "小熊宝" 的问题
    图解 CSS (5): font 字体
    图解 CSS (9): 列表
    图解 CSS (11): 理解样式表的逻辑
    图解 CSS (8): 浮动、显示、隐藏
    图解 CSS (10): 链接、继承、放缩、鼠标指针、其他(待补充...)
    多线程编程(2) 从 CreateThread 说起
  • 原文地址:https://www.cnblogs.com/gjpg/p/5070726.html
Copyright © 2011-2022 走看看