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

发布时间 2023-04-03 22:34:26作者: 小花护符

 

输入样例:

i+i*i#

我的题解:

#include<bits/stdc++.h>
using namespace std;
char s[100];
int num,k;
void E();
void F();
void G();
void T();
void S();


void E()
{
    if(s[k]=='i'||s[k]=='(')
    {
        printf("%d E-->TG\n",num++);
        T();
        G();
    }
    else
    {
        cout<<"error"<<endl;
        exit(0);
    }
}
void G()
{
    if(s[k]=='+')
    {
        printf("%d G-->+TG\n",num++);
        k++;
        T();
        G();
    }
    else   printf("%d G-->&\n",num++);
}
void T()
{
    if(s[k]=='('||s[k]=='i')
    {
        printf("%d T-->FS\n",num++);
        F();
        S();
    }
    else
    {
        printf("error\n");
        exit(0);
    }
}
void S()
{
    if(s[k]=='*')
    {
        printf("%d S-->*FS\n",num++);
        k++;
        F();
        S();
    }
    else printf("%d S-->&\n",num++);
}
void F()
{
    if(s[k]=='(')
    {
        printf("%d F-->(E)\n",num++);
        k++;
        E();
        if(s[k]==')')
        {
            k++;
        }
        else
        {
            cout<<"error"<<endl;
            exit(0);
        }
    }
    else if(s[k]=='i')
    {
        printf("%d F-->i\n",num++);
        k++;
    }
    else
    {
        cout<<"error"<<endl;
        exit(0);
    }
}
int main()
{
    scanf("%s",s);
    E();
    if(s[k]!='#') cout<<"error"<<endl;
    else cout<<"accept"<<endl;
}