【编译原理】语法分析

来源:互联网 发布:创网站软件下载 编辑:程序博客网 时间:2024/05/01 03:28


#include<iostream>#include<string>using namespace std;#define RSB 0 //Right square bracket  右方括号#define VT  1 //非终结符 #define RB  2 //Right bracket 右括号#define EQUAL 3//=号/*L → AL'L'→ ||AL' | εA → BA'A' → &&BA' | εB → !R | RR → ER' | [L]R' → >R'' | <R'' | ==E | !=E | εR'' → =E | EE → TE'E' → +TE'|εT → FT'T' → *FT'|εF → (E) | i */void L();void Lp();void A();void Ap();void B();void R();void Rp();void Rpp();void E();void E();void Ep();void T();void Tp();void F();void D(string s);void D(char now,string fun);string s;int i = 0;int main(){while(1){cin>>s;s += '#';i = 0;try{L();}catch(int e){cout<<"在("<<i+1<<")"<<s[i]<<"处停止。"<<endl;switch(e){case RSB:cout<<"没有找到右方括号]。"<<endl;continue;case VT:cout<<"没有匹配到非终结符i。"<<endl;continue;case RB:cout<<"没有找到右括号)。"<<endl;continue;case EQUAL:cout<<"没有找到等号=。"<<endl;continue;default:break;};}if(i<s.length() &&  s[i] == '#')cout<<"匹配成功!"<<endl;else{cout<<"匹配不成功!"<<endl;cout<<"在("<<i+1<<")"<<s[i]<<"处停止。"<<endl;}}return 0;}void D(string s){cout<<s<<endl;}void D(char now,string fun){cout<<now<<' '<<fun<<endl;}void L(){A();Lp();}void Lp(){if(s[i] == '|' && s[i+1] == '|'){i += 2;A();Lp();return;}}void A(){B();Ap();}void Ap(){if(s[i] == '&' && s[i+1] == '&'){i += 2;B();Ap();}}void B(){if(s[i] == '!'){++i;}R();}void R(){if(s[i] == '['){++i;L();if(s[i] == ']'){++i;return;}else{throw RSB;//右方括号}}E();Rp();}void Rp(){switch(s[i]){case '>':case '<':++i;Rpp();return;case '=':case '!':++i;if( s[i] == '='){++i;}else{throw EQUAL;}E();return;default:return;};}void Rpp(){if(s[i] == '='){++i;}E();}void E(){T();Ep();}void Ep(){if(s[i] == '+'){++i;T();Ep();}}void T(){F();Tp();}void Tp(){if(s[i] == '*'){++i;F();Tp();}}void F(){switch(s[i]){case '(':++i;E();if(s[i] == ')'){++i;}else{throw RB;//没有匹配到右括号}break;case 'i':++i;break;default://D("没有匹配到F");throw VT;//没有匹配到非终结符i 或 (};}


0 0
原创粉丝点击