#include<bits/stdc++.h> #define inf 0x3f3f3f3f #define ms(x) memset(x,0,sizeof(x)) #define mf(x) memset(x,inf,sizeof(x)) using namespace std; const int N = 1041; const int M = 205; string key[7] = {"main", "if", "else", "for", "while", "int"}; // 6 string bound[7] = {",", ";", "(", ")", "{", "}"}; // 6 string oper[12] = {"=", "+", "-", "*", "/", "<", "<=", ">", ">=", "==", "!="}; //11 string s; vector<string>ans1,ans2; bool isDig(string s) { int len = s.length(); for(int i=0; i<len; i++) { if(!(s[i]<='9' && s[i]>='0')) return false; } return true; } void pb(string s1, string s2){ ans1.push_back(s1); ans2.push_back(s2); cout<<"("<<s1<<","<<s2<<")"<<endl; } bool is(char c){ if(c=='=') return true; return false; } void solve(string s){ int len = s.length(); string tp; for(int i=0;i<len;i++){ if(s[i]=='='||s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='<'||s[i]=='>'||s[i]=='!'){ if(!tp.empty()){ if(isDig(tp)) pb("integer", tp); else pb("identifier", tp); tp.clear(); } string bdn; if(i+1<len && is(s[i+1])){ bdn += s[i]; bdn += s[i+1]; } else bdn += s[i]; pb("operator", bdn); if(bdn.size()==2) i++; } else tp+=s[i]; } if(!tp.empty()){ if(isDig(tp)) pb("integer", tp); else pb("identifier", tp); tp.clear(); } } int main() { int o = 0; while(cin>>s) { int len = s.length(), bsz = 0; string tp, id, bdn; for(int i=0; i<=len; i++) { int f = 0; for(int p = 0; p<6; p++) { if(i==len || s[i]== bound[p][0]) { if(!tp.empty()) { for(int k=0; k<6; k++) { if(tp == key[k]) { pb("keyword", tp); tp.clear(); break; } } } if(!tp.empty()) { for(int k=0; k<11; k++) { if(tp == oper[k]) { pb("operator", tp); tp.clear(); break; } } } if(!tp.empty()) { if(isDig(tp)) { pb("integer", tp); tp.clear(); } } if(!tp.empty()) { // pb("identifier", tp); solve(tp); tp.clear(); } if(i!=len){ bdn+=s[i]; pb("boundary", bdn); bdn.clear(); } f = 1; break; } } if(!f) tp+=s[i]; } } return 0; }
SDUT 编译原理 小C语言--词法分析程序
最新推荐文章于 2022-05-15 19:17:39 发布