Пример #1
0
State *post2nfa(char *postfix)
{
	FragStack stk;

	int index = 0;
	for (char *p = postfix; *p; p++, index++) {
		switch (*p) {
		case '&':
			{
				FragPtr f2 = stk.back();
				stk.pop_back();
				FragPtr f1 = stk.back();
				stk.pop_back();
				f1->patchTo(f2->start);
				stk.push_back(newFrag(f1->start, f2->out));
			} break;
		case '|':
			{
				FragPtr f2 = stk.back();
				stk.pop_back();
				FragPtr f1 = stk.back();
				stk.pop_back();
				State *s = new State(SPLIT, f1->start, f2->start);
				stk.push_back(newFrag(s, append(f1->out, f2->out)));
			} break;
		case '?':
			{
				FragPtr f = stk.back();
				stk.pop_back();
				State *s = new State(SPLIT, f->start, NULL);
				stk.push_back(newFrag(s, append(f->out, list1(&s->out1))));
			} break;
		case '*':
			{
				FragPtr f = stk.back();
				stk.pop_back();
				State *s = new State(SPLIT, f->start, NULL);
				f->patchTo(s);
				stk.push_back(newFrag(s, list1(&s->out1)));
			} break;
		case '+':
			{
				FragPtr f = stk.back();
				stk.pop_back();
				State *s = new State(SPLIT, f->start, NULL);
				f->patchTo(s);
				stk.push_back(newFrag(f->start, list1(&s->out1)));
			} break;
		default:
			{
				State *s = new State(*p, NULL, NULL);
				stk.push_back(newFrag(s, list1(&s->out)));
			} break;
		}

		begin(index);
		drawNfa(stk, index);
		end();
	}

	assert(stk.size() == 1);
	FragPtr f = stk.back();
	stk.pop_back();
	f->patchTo(&match);

	stk.push_back(f);
	begin(index);
	drawNfa(stk, index);
	end();

	return f->start;
}
void readFinfFiles(char *gsDir)
/* Read in .finf files and save info in cloneHash/cloneList. */
{
struct lineFile *lf;
struct clone *clone = NULL;
struct endInfo *end;
char fileName[512];
int i;
char *words[7];
char lastClone[64];
char cloneName[64];
int gsInfoCount = 0;
struct frag *frag;
boolean isFin;
char *s, *e;

strcpy(lastClone, "");
for (i=0; i<ArraySize(gsFiles); ++i)
    {
    isFin = (i <= 0);
    sprintf(fileName, "%s/%s", gsDir, gsFiles[i]);
    printf("Reading info from %s\n", fileName);
    lf = lineFileOpen(fileName, TRUE);
    while (lineFileRow(lf, words))
        {
	if (!sameString(words[1], lastClone))
	    {
	    struct clone *oldClone;
	    strcpy(lastClone, words[1]);
	    strcpy(cloneName, words[1]);
	    AllocVar(clone);
	    s = strchr(cloneName, '.');
	    if (s == NULL)
	        errAbort("Bad clone name format line %d of %s\n", lf->lineIx, lf->fileName);
	    if (strlen(s) >= sizeof(clone->version))
	        errAbort("Bad clone name format line %d of %s\n", lf->lineIx, lf->fileName);
	    strcpy(clone->version, s);
	    chopSuffix(cloneName);
	    clone->size = atoi(words[3]);
	    if ((oldClone = hashFindVal(cloneHash, cloneName)) != NULL)
		{
		if (isFin && clone->size == oldClone->size && sameString(clone->version, oldClone->version))
		    warn("Apparently benign duplication of %s line %d of %s", cloneName, lf->lineIx, lf->fileName);
		else
		    warn("%s duplicated line %d of %s (size %d oldSize %d)", cloneName, lf->lineIx, lf->fileName,
		    	clone->size, oldClone->size);
		}
	    hashAddSaveName(cloneHash, cloneName, clone, &clone->name);
	    clone->isFin = isFin;
	    slAddHead(&cloneList, clone);
	    }
	frag = newFrag(words[0], lf);
	slAddTail(&clone->fragList, frag);
	++clone->fragCount;
	if (!clone->isFin && !sameString(words[6], "?") && !sameString(words[6], "i") 
	   && !sameString(words[6], "w"))
	    {
	    char *s = strchr(words[0], '~');
	    char c;

	    if (s == NULL)
	        errAbort("Expecting ~ in fragment name line %d of %s\n", lf->lineIx, lf->fileName);
	    ++s;
	    AllocVar(end);
	    end->contig = cloneString(s);
	    subChar(s, '.', '_');
	    end->text = cloneString(words[6]);
	    c = lastChar(end->text);
	    if (!(c == 'L' || c == 'R'))
	        c = '?';
	    end->lr = c;
	    slAddHead(&clone->gsList, end);
	    ++gsInfoCount;
	    }
	}
    lineFileClose(&lf);
    }
printf("Found %d ends in %d clones\n", gsInfoCount, slCount(cloneList));
}