【編譯原理】語法分析
阿新 • • 發佈:2019-01-07
#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 | R R → ER' | [L] R' → >R'' | <R'' | ==E | !=E | ε R'' → =E | E E → 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 或 ( }; }