那些年我们一起编...吧 关注:9贴子:106
  • 3回复贴,共1

【0421:编译原理(递归下降分析程序)】

只看楼主收藏回复



1楼2014-04-21 10:38回复
    3楼2014-04-21 10:41
    回复
      递归下降分析程序时,每个函数名是相应的非总结符,函数体则根据产生式规则又不符号串的结构编写,基本思路如下:
      (1)当遇到终结符a时,则编写如下语句:
      if(当前独来的输入符号==‘a’)读入下一个输入符号。
      (2)当遇到非终结符A时,则编写语句调用A()。
      (3)当遇到A->空产生式规则时,则编写语句:
      if(当前读来的输入符号不属于Follow(A),error();
      (4)当某个非终结符有多个候选产生式规则时,分下面两种情况处理:
      (4.1)if(当前读来的输入符号输入First(ai)),按照规则A->ai进行推导;
      (4.2)if(当前读来的输入符号输入Follow(A),且ai=>空),按照规则A->ai进行推导;


      4楼2014-04-21 10:48
      回复
        简易版:
        /*
        E->TE1;
        E1->+TE1|-TE1|ε;
        T->FT1;
        T1->*FT1|/FT1|ε;
        F->(E)|i
        */
        #include <iostream>
        #include <string.h>
        using namespace std;
        char a[10];
        int flag=0;
        void E1();
        void T();
        void T1();
        void F();
        //void PrintString(){}
        //void PrintRemain(){}
        //bool march(){}
        //void GetSymbol(){}
        void E(){
        T();
        E1();
        cout<<"E->TE1"<<endl;
        //flag = 1;
        //PrintString();
        //PrintRemain();
        }
        void E1(){
        if(a[flag]=='+'||a[flag]=='-')
        {
        cout<<"E1->"<<a[flag]<<"TE1"<<endl;
        flag++;
        T();
        E1();
        }
        else
        cout<<"E->ε"<<endl;
        }
        void T()
        {
        F();
        T1();
        cout<<"T->FT1"<<endl;
        }
        void T1()
        {
        if (a[flag]=='*'||a[flag]=='/'){
        cout<<"T1->"<<a[flag]<<"T1F"<<endl;
        flag++;
        F();
        T1();
        }
        else
        cout<<"T1->ε"<<endl;
        }
        void F(){
        if(a[flag]=='i'){
        cout<<"F->i"<<endl;
        flag++;
        }
        else if(a[flag]=='('){
        flag++;
        E();
        if(a[flag]==')'){
        cout<<"F->(E)"<<endl;
        flag++;
        }
        else
        {
        cout<<"括号不匹配!"<<endl;
        exit(0);
        }
        }
        else
        {
        cout<<"非法字符!"<<endl;
        exit(0);
        }
        }
        int main()
        {
        cout<<"请输入算术表达式!(请以#结尾)"<<endl;
        cin>>a;
        E();
        if(a[flag]=='#')
        cout<<"句子结构正确!"<<endl;
        else
        cout<<"无结束标志,分析失败!"<<endl;
        return 0;
        }


        5楼2014-04-21 12:01
        回复