int main(){ redisContext* c = redisConnect("127.0.0.1", 6379); redisReply *reply; if(c->err){ redisFree(c); printf("connection fail\n"); return; }else{ printf("connection succeed\n"); } if(!freopen("infile","r",stdin)){ printf("error open\n"); exit(1); } char key[10],value[10]; int i=0; for(;i<100;i++){ scanf("%s %s",key,value); setAppend(key,value,c); } redisGetReply(c,(void **)&reply); freeReplyObject(reply); redisFree(c); return 0; }
digType* getSequenceFirst(pRuleNode p) { digType* first = (digType*)malloc(sizeof(long)); int includeEpsilon = 1; *first = 0; for (pRuleNode i = p; i; i = i->next) { pSymbolNode ps = findSymbolPoint(i->serial); first = setAppend(&first, ps->first, 0); if (*(ps->first + 1)) { includeEpsilon = 0; break; } } if (includeEpsilon) { digType temp[2] = { 1, 0 }; first = setAppend(&first, temp, 1); } return first; }
void getFollow(pSymbolNode p) { // p is the start of grammar if (p == ll[2]) { if (p->follow) { digType temp[2] = { 1, -1 }; p->follow = setAppend(&p->follow, temp, 1); } else { p->follow = (digType*)malloc(sizeof(long) * 2); *(p->follow) = 1; *(p->follow + 1) = -1; } } for (pRule r = gRules; r; r = r->next) { // Rules in the form of A ::= alpha P beta for (pRuleNode pr = r->addr->next; pr; pr = pr->next) { if (pr->serial == p->serial) { pSymbolNode beta; pSymbolNode a = findSymbolPoint(r->addr->serial); digType* firstOfBeta; // beta = epsilon if (!pr->next) { if (a->follow) if (p->follow) p->follow = setAppend(&p->follow, a->follow, 1); else { digType len = *(a->follow) + 1; p->follow = (digType *)malloc(sizeof(long) * len); memcpy(p->follow, a->follow, len * sizeof(long)); } continue; } beta = findSymbolPoint(pr->next->serial); firstOfBeta = getSequenceFirst(pr->next); // First(beta) without epsilon will be appended to Follow(B); if (p->follow) { p->follow = setAppend(&p->follow, firstOfBeta, 0); } else { digType len = *(firstOfBeta); if (*(firstOfBeta + 1) == 0) len--; p->follow = (digType *)malloc(sizeof(long) * (len + 1)); if (*(firstOfBeta + 1) == 0) memcpy((void*)(p->follow + 1), (void*)(firstOfBeta + 2), len * sizeof(long)); else memcpy((void*)(p->follow + 1), (void*)(firstOfBeta + 1), len * sizeof(long)); *(p->follow) = len; } // if beta can be generalized to epsilon if (!*(firstOfBeta + 1)) { if (a->follow) if (p->follow) p->follow = setAppend(&p->follow, a->follow, 1); else { digType len = *(a->follow) + 1; p->follow = (digType *)malloc(sizeof(long) * len); memcpy(p->follow, a->follow, len * sizeof(long)); } } free(firstOfBeta); } } } }
void getSymbolFirst(pSymbolNode p) { // Terminals if (p->serial % 2 == 0) { p->first = (digType*)malloc(sizeof(long) * 2); *(p->first) = 1; *(p->first + 1) = p->serial; } // Nonterminals else { for (pRule r = gRules; r; r = r->next) { // Rules about P if (r->addr->serial == p->serial) { // Rules like P ::= p alpha or 0 if (r->addr->next->serial % 2 == 0) { pSymbolNode pa = findSymbolPoint(r->addr->next->serial); // P ::= p alpha if (r->addr->next->serial) { if (p->first) { p->first = setAppend(&p->first, pa->first, 1); } else { p->first = (digType*)malloc(sizeof(long) * 2); *(p->first) = 1; *(p->first + 1) = pa->serial; } } // A ::= 0 else { if (p->first) { digType temp[2] = { 1, 0 }; p->first = setAppend(&p->first, temp, 1); } else { p->first = (digType*)malloc(sizeof(long) * 2); *(p->first) = 1; *(p->first + 1) = 0; } } } // Rules like A ::= B1 B2 ... Bk else { for (pRuleNode pr = r->addr->next; pr; pr = pr->next) { pSymbolNode pb = findSymbolPoint(pr->serial); if (pb->first) { if (p->first) p->first = setAppend(&p->first, pb->first, 0); else { digType len = *(pb->first); if (*(pb->first + 1) == 0) len--; p->first = (digType *)malloc(sizeof(long) * (len + 1)); if (*(pb->first + 1) == 0) memcpy((void*)(p->first + 1), (void*)(pb->first + 2), len * sizeof(long)); else memcpy((void*)(p->first + 1), (void*)(pb->first + 1), len * sizeof(long)); *(p->first) = len; } if (pr->next == 0 && *(pb->first + 1) == 0) { if (p->first) { digType temp[2] = { 1, 0 }; p->first = setAppend(&p->first, temp, 1); } else { p->first = (digType*)malloc(sizeof(long) * 2); *(p->first) = 1; *(p->first + 1) = 0; } } if (*(pb->first + 1) != 0) break; } else break; } } } } } }