2016年秋季《编译原理》课程实验(2014级)表达式语法分析——递归子程序法

来源:互联网 发布:wind金融数据 编辑:程序博客网 时间:2024/05/22 00:39
#include<stdio.h>#include<string>#include<iostream>#include<algorithm>#include<stack>using namespace std;int num;stack<char> A;stack<char> B;int f(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 !='*')//保持不变,E题不同    {       cout<<num<<" "<<"S-->&"<<endl;        A.pop();        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 == 'F' && y == '(')    {         cout<<num<<" "<<"F-->(E)"<<endl;        A.pop();        A.push(')');        A.push('E');        A.push('(');        num++;        return 1;    }    else    {         if(x == y)        {                         A.pop();             B.pop();            return 1;        }        else        {            return 0;        }    }}void reset(){    num = 0;    while(!A.empty())    {      A.pop();    }    A.push('#');    A.push('E');    while(!B.empty())    {        B.pop();    }}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 = f(A.top(),B.top());                if(key == 0)                {                    cout<<"error"<<endl;                    break;                }            }        }    }    return 0;}
//与E题不同也在G和S,为G时候不为‘+’,就G->&, S也一样

0 0
原创粉丝点击