SDUT 編譯原理 小C語言--詞法分析程序

#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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章