编译原理作业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\n"); continue;
        }
        int tt = E(1,n);
        if(tt) printf("Yes\n");
        else printf("No\n");
    }
    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 \n",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",n);
        for(int i = 0; i < n; ++i) {
            int a = To[i][0][0]-'0';
            printf("%c ",Ch[i]); printf("%d\n",a);
            for(int j = 1; j <= a; ++j) {
                printf("%s",To[i][j]);
                if(j != a) printf(" ");
            } printf("\n");
        }
    }
    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("\n");
}
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("\n");
        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\n",t1,i,j);
                                    break;
                                }else {
                                    int t1 = mp[To[i][j][l]];
                                    tmp |= F[t1];
                              //      if(cc == 0) printf("hhh: %d %d %d\n",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\n",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",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) \n");
                else if(cc == 0) printf("$ ");
            }
            printf("\n");
        }

    }
    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:\n",++ca);
        while(!Q.empty()) {
            char tt = Q.top(); Q.pop();
            if(tt == '#') {
                if(st != len) {
                    printf("false2\n");
                    fl = 0;
                }
                break;
            }

            if(!conchr.count(tt)) {
                if(st == len) {
                    printf("false1\n");
                    fl = 0; break;
                }
                if(tt != s[st]) {
                    fl = 0; break;
                }else {
                    printf("%c -- %c\n",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\n", 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\n");
        else printf("No\n");
    }
    return 0;
}
/*
5 6
E TG $ $ TG $ $
G $ +TG $ $ ~ ~
T FY $ $ FY $ $
Y $ ~ *FY $ ~ ~
F d $ $ (E) $ $
d + * ( ) #
d+(d+d*d)#


*/
posted @ 2016-12-02 19:35  basasuya  阅读(161)  评论(0编辑  收藏  举报