• 构造递归下降分析程序


    词法分析程序scaner( ),sym;error( )


    每个函数名是相应的非终结符,函数体是根据右部符号串的结构编写。


    当遇到终结符时,则编写语句if(当前读入的符号==a)则读入下一个单词
    当遇到非终结符A时,则编写语句调用A( )
    当遇到规则A→ε时,则编写语句调用if(当前读入的符号∉ FOLLOW(A))error( )

    对于给定的文法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>
    #include<string>
    char str[10];   //记录要分析的字符串
    int x=0;        //记录第一个字符
     
    void E();           
    void X();           
    void T();           
    void Y(); 
    void F(); 
     
    int main()
    {
        int len;
        printf("请输入算数表达式:");
        scanf("%s",str);
        len=strlen(str);
        str[len]='#';
        str[len+1]='';
        E();
        printf("
    正确!
    ");
        strcpy(str,"");
        x=0;
        return 0;
    }
     
    void E()
    {
        T();
        X();
    }
     
    void X()
    {
        if(str[x]=='+'||str[x]=='-')
        {
            x++;
            T();
            X();
        } 
    }
     
    void T()
    {
        F();
        Y();
    }
     
    void Y()
    {
        if(str[x]=='*'||str[x]=='/')
        {
            x++;
            F();
            Y();
        }
    }
     
    void F()
    {
        if(str[x]>='a'&&str[x]<='z')
        {
            x++;
        }
        else if(str[x]>=0&&str[x]<=9)
        {
            x++;
        }
        else if (str[x]=='(')
        {     
            x++;
            E();
            if(str[x]==')')
            {
                x++; 
            }
            else
            {
                printf("
    错误!
    ");
                exit(0);
            }
        } 
        else
        {
            printf("
    错误r!
    "); 
    exit(0);
     }
     }
  • 相关阅读:
    JS_Boolean Logic
    js String
    .Net之路(二)简介
    自考 操作系统概论计算机系统
    IT大学生最重要的五个能力
    数据库表及字段命名规范
    简述MVC分层
    .Net之路(一)概述
    设计模式(4)迭代器模式
    .Net之路(三)如何连接数据库?
  • 原文地址:https://www.cnblogs.com/zhiling123/p/6182625.html
Copyright © 2020-2023  润新知