编译原理(表达式语法分析——递归子程序法)

递归子程序法是一种确定的自顶向下语法分析方法,要求文法是LL(1)文法。它的实现思想是对应文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时能够按LL(1)形式唯一地确定选择某个候选式进行推导。请根据下面的表达式LL(1)文法,构造递归子程序,完成对表达式的语法分析。

表达式文法如下:

    ETG

    G+TG | ε

    TFS

    S*FS | ε

    F(E) | i


对于给定的输入串(长度不超过50个符号),请输出分析过程中用到的所有产生式,并指明该输入串是否为该文法能生成的表达式,
输出共11行,前10行每行两个数据用空格隔开,表示推导时所用产生式顺序号(从0开始),最后一行是accept,表示i+i*i是文法能生成的合法表达式。注:其中&符号代表文法中的ε符号。
例如:

i+i*i是文法能生成的一个表达式,输出格式如下:

0 E-->TG

1 T-->FS

2 F-->i

3 S-->&

4 G-->+TG

5 T-->FS

6 F-->i

7 S-->*FS

8 F-->i

9 S-->&

10 G-->&

accept

#include<stdio.h>
#include<string>
#include<iostream>
#include<stack>
using namespace std;
stack<char> A;
stack<char> B;
int num;
void reset()
{
   num=0;
   while(!A.empty())
   {
     A.pop();
   }
   while(!B.empty())
   {
       B.pop();
   }
   A.push('#');
   A.push('E');
}
int panduan(char x,char y){
    if(x=='E')
    {
        cout<<num<<" "<<"E-->TG"<<endl;
        A.pop();
        A.push('G');
        A.push('T');
        num++;
        return 1;
    }
    else if(x=='G'&&y=='+')
    {
        cout<<num<<" "<<"G-->+TG"<<endl;
        A.pop();
        A.push('G');
        A.push('T');
        A.push('+');
        num++;
        return 1;
    }
    else if(x=='G'&&y!='+')
    {
        cout<<num<<" "<<"G-->&"<<endl;
        A.pop();
        num++;
        return 1;
    }
    else if(x=='T')
    {
         cout<<num<<" "<<"T-->FS"<<endl;
         A.pop();
         A.push('S');
         A.push('F');
         num++;
         return 1;
    }
    else if(x=='S'&&y=='*')
    {
        cout<<num<<" "<<"S-->*FS"<<endl;
        A.pop();
        A.push('S');
        A.push('F');
        A.push('*');
        num++;
        return 1;
    }
    else if(x=='S'&&y!='*')
    {
        cout<<num<<" "<<"S-->&"<<endl;
        A.pop();
        num++;
        return 1;
    }
    else if(x=='F'&&y=='(')
    {
        cout<<num<<" "<<"F-->(E)"<<endl;
        A.pop();
        A.push(')');
        A.push('E');
        A.push('(');
        num++;
        return 1;
    }
    else if(x=='F'&&y=='i')
    {
        cout<<num<<" "<<"F-->i"<<endl;
        A.pop();
        A.push('i');
        num++;
        return 1;
    }
    else
    {
        if(x==y)
        {
            A.pop();
            B.pop();
            return 1;
        }
        else
        {
            return 0;
        }
    }

}
int main()
{
    string s;
    while(cin>>s)
    {

       reset();//如果上一次栈中有数据清空
       int len=s.length();
       for(int i=len-1;i>=0;i--)
       {
           B.push(s[i]);
       }
       while(1){
           if(A.top()=='#'&&B.top()=='#')
           {
               cout<<"accept"<<endl;
               break;
           }
          else
            {
                int key = panduan(A.top(),B.top());
                if(key == 0)
                {
                    cout<<"error"<<endl;
                    break;
                }
            }
       }
    }
}

展开阅读全文

没有更多推荐了,返回首页