zoukankan      html  css  js  c++  java
  • 递归下降语法分析

    对于给定的文法G[E] :

    E→E+T|E-T|T
    T→T*F| T/F|F
    F→(E)|i

    消除左递归后的文法是:
    E→TE'

    E'→+TE'|-TE'|∑

    T→FT'

    T'→*FT'|/FT'|∑

    F→(E)|i

    是否是LL(1)文法?

    select(E→TE')=first(TE')={(,i}
    select(E'→+TE')=first(+TE')={+}
    select(E'→-TE')=first(-TE')={-}
    select(E'→∑)=follow(E')={),#}
    select(T→FT')=first(FT')={(,i}
    select(T'→*FT')=first(*FT')={*}
    select(T'→/FT')=first(/FT')={/}
    select(T'→∑)=follow(T')={+,-,),#)
    select(F→(E))=first((E))={(}
    select(F→i)=first(i)={i}

    由上分析,得知此文法满足LL(1)文法

    #include<stdio.h>
    
    void E();
    
    void T();
    
    void E1();
    
    void T1();
    
    void F();
    
     
    
    char s[100];
    
    int i, SIGN;
    
     
    
    int main()
    
    {
    
    printf("请输入一个语句,以#号结束语句(直接输入#号推出)
    ");
    
    while( 1 )
    
    {
    
    SIGN = 0;
    
    i=0;
    
     
    
    scanf("%s",&s);
    
     
    
    if( s[0] == '#')
    
    return 0;
    
     
    
    E();
    
     
    
    if(s[i]=='#')
    
    printf("正确语句!
    ");
    
     
    
    printf("请输入一个语句,以#号结束语句
    ");
    
     
    
    }
    
    return 1;
    
    }
    
     
    
    void E()
    
    {
    
    if(SIGN==0)
    
    {
    
    T();
    
    E1();
    
    }
    
    }
    
     
    
    void E1()
    
    {
    
    if(SIGN==0)
    
    {
    
    if(s[i]=='+')
    
    {
    
    ++i;
    
    T();
    
    E1();
    
    }
    
    else if(s[i]!='#'&&s[i]!=')')
    
    {
    
    printf("语句有误!
    ");
    
    SIGN=1;
    
    }
    
    }
    
    }
    
     
    
    void T()
    
    {
    
    if(SIGN==0)
    
    {
    
    F();
    
    T1();
    
    }
    
    }
    
     
    
    void T1()
    
    {
    
    if(SIGN==0)
    
    {
    
    if(s[i]=='*')
    
    {
    
    ++i;
    
    F();
    
    T1();
    
    }
    
    else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+')
    
    {
    
    printf("语句有误!
    ");
    
    SIGN=1;
    
    }
    
    }
    
    }
    
     
    
    void F()
    
    {
    
    if(SIGN==0)
    
    {
    
    if(s[i]=='(')
    
    {
    
    ++i;
    
    E();
    
    if(s[i]==')')
    
    ++i;
    
    else if(s[i]== '#')
    
    {
    
    printf("语句有误!
    ");
    
    SIGN=1;
    
    ++i;
    
    }
    
    }
    
    else if(s[i]=='i')
    
    ++i;
    
    else
    
    {
    
    printf("语句有误!
    ");
    
    SIGN=1;
    
    }
    
    }
    
    }
    

      

  • 相关阅读:
    nginx配置zabbix下setup.php(web页面)无法显示,浏览器无法打开
    CentOS release 6.5下jdk1.7升级到1.8
    tcp流量控制
    图像处理服务器
    muduo rpc protobuf 实现学习
    p2p nat 穿透原理
    博客-livevent-stl-cpp-nginx
    使用eventfd创建一个用于事件通知的文件描述符
    多线程设计的类的思考!
    ftp协议服务器与tinyhttp服务demo
  • 原文地址:https://www.cnblogs.com/zzrf/p/6188699.html
Copyright © 2011-2022 走看看