SDUT编译原理:表达式语法分析——递归子程序法
输入样例:
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; }