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)#
*/