zoukankan      html  css  js  c++  java
  • 编译原理作业3,4

    12.16更新 做了关于左递归和回溯的消除
    并且还做了first,follow,select集的提取
    总之写的很烦,而且只验证了一个样例

    先做了3 就是一个递归 流坑給4 明天或者后天写

    #include<bits/stdc++.h>
    using namespace std;
    
    char s[105];
    int T(int l, int r); int _T(int l,int r); int E(int l,int r); int F(int l,int r); int _F(int l,int r);
    
    int _E(int l, int r) {
        if(l > r) return 1;
        if( s[l] != '+' ) return 0;
        int fl = 0;
        for(int i = l; i <= r; ++i) {
            if( T(l+1,i) && _E(i+1,r) ) {
                fl = 1; break;
            }
        }
        return fl;
    }
    int _T(int l,int r) {
        if(l > r) return 1;
        if(s[l] != '*') return 0;
        int fl = 0;
        for(int i = l; i <= r; ++i) {
            if( F(l+1,i) && _T(i+1, r) ) {
                fl = 1; break;
            }
        }
        return fl;
    }
    int F(int l,int r) {
        if(s[l] == '(' && E(l+1,r-1) && s[r] == ')') return 1;
        else if(r-l+1 == 1 && s[l] == 'i') return 1;
        else return 0;
    }
    int T(int l, int r) {
        if(l > r) return 0;
        int fl = 0;
        for(int i = l-1; i <= r; ++i) {
            if( F(l, i) && _T(i+1, r) ) {
                fl = 1; break;
            }
        }
        return fl;
    }
    int E(int l, int r) {
        if(l > r) return 0;
        int fl = 0;
        for(int i = l-1; i <= r; ++i) {
            if( T(l, i) && _E(i+1, r) ) {
                fl = 1;
                break;
            }
        }
        return fl;
    }
    
    int main() {
        int ca = 0;
        while(~scanf("%s",s+1)) {
            printf("Case #%d: ",++ca);
            int n = strlen(s+1);
            int fl = 1;
            for(int i = 1; i <= n; ++i) {
                if(s[i] != 'i' && s[i] != '(' && s[i] != ')' && s[i] != '+' && s[i] != '*') {
                    fl = 0; break;
                }
            }
            if(!fl) {
                printf("NO
    "); continue;
            }
            int tt = E(1,n);
            if(tt) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
    

    填坑 今天是个好日子 提前做完计组(抱大腿) 晚上又把编译原理全部完成

    #include<bits/stdc++.h>
    using namespace std;
    #define sz(X) ((int)X.size())
    
    int n;
    char s[20];
    char Ch[30];
    char To[30][30][30];
    map<char, int> mp;
    
    int main() {
        while(~scanf("%d",&n)) {
    
            mp.clear();
            int all = n;
            for(int i = 0; i < n; ++i) {
                scanf("%s",s); Ch[i] = s[0];
                mp[Ch[i]] = i;
                scanf("%s",To[i][0]);
                int a = To[i][0][0]-'0';
                for(int j = 1; j <= a; ++j) {
                    scanf("%s",To[i][j]);
                }
                int st = 0;
                for(int j = 1; j <= a; ++j) {
                    if(To[i][j][0] == Ch[i]) {
                        st ++;
                        if(st != j) {
                            for(int k = 0; k < 30; ++k) {
                                swap(To[i][j][k], To[i][st][k]);
                            }
                        }
                    }
                }
            }
    
            for(int i = 0; i < n; ++i) {
                int a = To[i][0][0]-'0';
                char pos = 0; int id;
                if(To[i][1][0] == Ch[i]) {
                    for(int j = 'A'; j <= 'Z'; ++j) {
                        if(!mp.count(j)) {
                            id = all; mp[j] = all++;
                            pos = j; break;
                        }
                    }
                }
                if(!pos) continue;
                Ch[id] = pos;
                int cc = 0; int _cc = 0;
                for(int j = 1; j <= a; ++j) {
                    if(To[i][j][0] == Ch[i]) {
                        ++cc;
                        int len = strlen(To[i][j]);
                        for(int k = 0; k < len-1; ++k) To[id][cc][k] = To[i][j][k+1];
                        To[id][cc][len-1] = pos; To[id][cc][len] = 0;
                    }
                    else {
                        ++_cc;
                        int len = strlen(To[i][j]);
                        for(int k = 0; k < len; ++k) To[i][_cc][k] = To[i][j][k]; To[i][_cc][len] = pos; To[i][_cc][len+1] = 0;
                    }
                }
                ++cc;
                To[id][cc][0] = '~'; To[id][cc][1] = 0;
                To[i][0][0] = '0' + _cc; To[id][0][0] = '0' + cc;
            }
    
            n = all;
            for(int i = 0; i < all; ++i) {
                int a = To[i][0][0]-'0';
                vector<int> vc[200]; int vis[200];
                memset(vis,0,sizeof(vis));
                for(int j = 0; j < 200; ++j) vc[j].clear();
                for(int j = 1; j <= a; ++j) {
                    int tt = To[i][j][0];
                    vc[tt].push_back(j);
                }
                for(int k = 0; k < 200; ++k) {
                    if(sz(vc[k]) >= 2) {
                        printf("%d 
    ",sz(vc[k]) );
                        char pos; int id;
                        for(int j = 'A'; j <= 'Z'; ++j) {
                            if(!mp.count(j)) {
                                mp[j] = n ++; id = n-1;
                                pos = j;
                                break;
                            }
                        }
                        Ch[id] = pos;
                        int cc = 0;
                        for(int j = 0; j < sz(vc[k]); ++j) {
                            int tt = vc[k][j];
                            int len = strlen(To[i][tt]);
                            ++cc;
                            for(int l = 1; l <= len; ++l) {
                                To[id][cc][l-1] = To[i][tt][l];
                            }
                            To[i][tt][1] = pos; To[i][tt][2] = 0;
                        }
                        To[id][0][0] = cc+'0';
    
                    }
                }
                int _cc = 0;
                for(int j = 1; j <= a; ++j) {
                    int tt = To[i][j][0];
                    if(!vis[tt]) {
                        vis[tt] = 1; _cc++;
                        int len = strlen(To[i][j]);
                        for(int k = 0; k <= len; ++k) {
                            To[i][_cc][k] = To[i][j][k];
                        }
    
                    }
                }
                To[i][0][0] = _cc+'0';
            }
    
            printf("%d
    ",n);
            for(int i = 0; i < n; ++i) {
                int a = To[i][0][0]-'0';
                printf("%c ",Ch[i]); printf("%d
    ",a);
                for(int j = 1; j <= a; ++j) {
                    printf("%s",To[i][j]);
                    if(j != a) printf(" ");
                } printf("
    ");
            }
        }
        return 0;
    }
    /*
    3
    E 2
    E+T T
    T 2
    T*F F
    F 2
    (E) i
    1
    A 6
    aB aC aD b c d
    
    */
    
    #include<bits/stdc++.h>
    using namespace std;
    #define sz(X) ((int)X.size())
    
    char s[20];
    char Ch[30];
    char To[30][30][30];
    map<char, int> mp;
    int vis[30];
    char stch[30]; int tot;
    map<char, int> chst;
    int F[30];
    int S[30];
    int A[30][30];
    
    void dfs(int x) {
        int a = To[x][0][0]-'0';
        for(int i = 1; i <= a; ++i) {
            int len = strlen(To[x][i]); int k = 0;
            while(k < len) {
                if(To[x][i][k] > 'Z' || To[x][i][k] < 'A') {
                    int cc = chst[To[x][i][k]];
                    F[x] |= 1<<cc;
                    break;
                }else {
                    int cc = mp[To[x][i][k]];
                    if(!vis[cc]) {
                        vis[cc] = 1; dfs(cc);
                    }
                    F[x] |= F[cc];
                    if( (F[cc] & 1) == 0) break;
                }
                ++k;
            }
        }
    }
    void show(int x) {
        for(int i = 1; i <= tot; ++i){
            if(x >> i & 1) {
                char tt = stch[i]; printf("%c ",tt);
            }
        }
        printf("
    ");
    }
    int main() {
        int n;
        while(~scanf("%d",&n)) {
            mp.clear(); tot = 0; chst.clear();
            memset(F,0,sizeof(F)); memset(S,0,sizeof(S)); memset(A,0,sizeof(A));
            memset(vis,0,sizeof(vis));
            /********First****************/
            chst['~'] = 0; stch[0] = '~';
            for(int i = 0; i < n; ++i) {
                scanf("%s",s);
                Ch[i] = s[0];
                mp[Ch[i]] = i;
                scanf("%s",To[i][0]);
                int a = To[i][0][0] - '0';
                for(int j = 1; j <= a; ++j) {
                    scanf("%s",To[i][j]);
                    int len = strlen(To[i][j]);
                    for(int k = 0; k < len; ++k) {
                        if(To[i][j][k] > 'Z' || To[i][j][k] < 'A') {
                            if(!chst.count(To[i][j][k])) {
                                chst[To[i][j][k]] = ++tot;
                                stch[tot] = To[i][j][k];
                            }
                        }
                    }
                }
            }
            chst['$'] = ++tot; stch[tot] = '$';
            for(int i = 0; i <= tot; ++i) printf("%c:%d ",stch[i],chst[stch[i]]); printf("
    ");
            for(int i = 0; i < n; ++i) {
                if(!vis[i]) {
                    vis[i] = 1;
                    dfs(i);
                }
            }
         //   for(int i = 0; i < n; ++i) show(F[i]);
    
            /**********Follow************/
            S[0] |= 1<<tot;
            while(1) {
                int ccc = 0;
                for(int i = 0; i < n; ++i) {
                    int a = To[i][0][0] - '0';
                    for(int j = 1; j <= a; ++j) {
                        int len = strlen(To[i][j]);
                        for(int k = 0; k < len; ++k) {
                            if(To[i][j][k] <= 'Z' && To[i][j][k] >= 'A') {
                                int cc = mp[To[i][j][k]];
                                int tt = S[cc]; int tmp = 0;
                                if(k == len-1)
                                    tt |= S[i];
                                for(int l = k+1; l < len; ++l) {
                                    if(To[i][j][l] > 'Z' || To[i][j][l] < 'A') {
                                        int t1 = chst[To[i][j][l]];
                                        tmp |= 1<<t1;
                                    //    if(cc == 0) printf("hh: %d %d %d
    ",t1,i,j);
                                        break;
                                    }else {
                                        int t1 = mp[To[i][j][l]];
                                        tmp |= F[t1];
                                  //      if(cc == 0) printf("hhh: %d %d %d
    ",t1,i,j);
                                        if( (F[t1] & 1) == 0) break;
                                    }
                                }
                                if(tmp & 1) {
                                    tt |= S[i];
                                }
                                tt |= tmp;
                                if(tt & 1) tt ^= 1;
                                if(tt != S[cc]) ccc ++;
                                S[cc] = tt;
                            }
                        }
                    }
                }
                if(!ccc) break;
            }
            for(int i = 0; i < n; ++i) show(S[i]);
          printf("HH: %s",To[2][2]);
            /*********Select*****************/
            for(int i = 0; i < n; ++i) {
                int a = To[i][0][0] - '0';
                for(int j = 1; j <= a; ++j) {
                    int len = strlen(To[i][j]);
                    int k = 0;
                    if(To[i][j][k] == '~') {
                     //   printf("%d %d
    ",i,j);
                        A[i][j] |= S[i];
                        continue;
                    }
                    while(k < len) {
                        if(To[i][j][k] > 'Z' || To[i][j][k] < 'A') {
                            int cc = chst[To[i][j][k]];
                            A[i][j] |= 1<<cc;
                            break;
                        }else {
                            int cc = mp[To[i][j][k]];
                            A[i][j] |= F[cc];
                            if( (F[cc] & 1) == 0) break;
                        }
                        ++k;
                    }
                    if(A[i][j] & 1) A[i][j] ^= 1;
                    if(k == len) A[i][j] |= S[i];
                }
            }
    
            printf("%d %d
    ",n,tot);
            for(int i = 0; i < n; ++i) {
                printf("%c: ",Ch[i]);
                int a = To[i][0][0] - '0';
                for(int j = 1; j <= tot; ++j) {
                    int cc = 0;
                    for(int k = 1; k <= a; ++k) {
                        if( ( (A[i][k])>>j) & 1) {
                            cc ++;
                            printf("%s ",To[i][k]);
                        }
                    }
                    if(cc >= 2) printf("sorry it not a LL(1) 
    ");
                    else if(cc == 0) printf("$ ");
                }
                printf("
    ");
            }
    
        }
        return 0;
    }
    /*
    5
    E 1
    TA
    T 1
    FB
    F 2
    (E) i
    A 2
    +TA ~
    B 2
    *FB ~
    
    
    */
    
    #include<bits/stdc++.h>
    using namespace std;
    const int N = 105;
    char s[N];
    char chrcon[N];
    map<char, int> conchr;
    char chred[N];
    map<char, int> edchr;
    char mp[N][N][N];
    int n, m;
    
    int main() {
        int ca = 0;
        scanf("%d %d",&n,&m);
        for(int i = 1; i <= n; ++i) {
                char a[10]; scanf("%s",a);
                conchr[a[0]] = i; chrcon[i] = a[0];
                for(int j = 1; j <= m; ++j) {
                    scanf("%s",mp[i][j]);
                }
            }
            for(int i = 1; i <= m; ++i) {
                char a[10]; scanf("%s",a);
                edchr[a[0]] = i; chred[i] = a[0];
            }
        while(~scanf("%s",s+1)) {
          //  conchr.clear(); edchr.clear();
    
    
            int len = strlen(s+1);
            int st = 1;
    
            stack<char> Q; Q.push('#'); Q.push(chrcon[1]);
            int fl = 1; printf("Case #%d:
    ",++ca);
            while(!Q.empty()) {
                char tt = Q.top(); Q.pop();
                if(tt == '#') {
                    if(st != len) {
                        printf("false2
    ");
                        fl = 0;
                    }
                    break;
                }
    
                if(!conchr.count(tt)) {
                    if(st == len) {
                        printf("false1
    ");
                        fl = 0; break;
                    }
                    if(tt != s[st]) {
                        fl = 0; break;
                    }else {
                        printf("%c -- %c
    ",s[st], tt);
                        st ++;
                    }
                }else {
                    int id1 = conchr[tt]; int id2 = edchr[s[st]];
    
                    char tmp = mp[id1][id2][0];
                    if(tmp == '$') {
                        fl = 0; break;
                    }else if(tmp != '~') {
                        printf("%c -> %s
    ", tt, mp[id1][id2]);
                        int l1 = strlen(mp[id1][id2]);
                        for(int i = l1-1; i >= 0; --i) Q.push(mp[id1][id2][i]);
                    }
                }
            }
            if(fl) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
    /*
    5 6
    E TG $ $ TG $ $
    G $ +TG $ $ ~ ~
    T FY $ $ FY $ $
    Y $ ~ *FY $ ~ ~
    F d $ $ (E) $ $
    d + * ( ) #
    d+(d+d*d)#
    
    
    */
    
  • 相关阅读:
    判断用户 是用的电脑还是手机 判断 是安卓还是IOS
    特殊符号
    如何在 ajax 外拿到 ajax 的数据???和ajax的参数
    事件(只有事件 没有其他)
    c3 新特性
    jquery 操作属性[选择器为主]
    按字母排序,sql语句查询法
    ubuntu12.04安装lamp的简单lamp
    Ubuntu 下傻瓜式安装配置lamp环境
    万能HTML编辑框 CuteEditor 使用详解
  • 原文地址:https://www.cnblogs.com/Basasuya/p/8433722.html
Copyright © 2011-2022 走看看