Renode *n;
n = e3(plex);
- if(lex(plex) == LREP) {
+ while(lex(plex) == LREP) {
switch(plex->rune) {
case L'*':
- return node(plex, TSTAR, n, nil);
+ n = node(plex, TSTAR, n, nil);
+ break;
case L'+':
- return node(plex, TPLUS, n, nil);
+ n = node(plex, TPLUS, n, nil);
+ break;
case L'?':
- return node(plex, TQUES, n, nil);
+ n = node(plex, TQUES, n, nil);
+ break;
}
}
plex->peek = 1;
return plex;
}
-static int
-maxthreads(Renode *tree)
-{
- tree = tree->left;
- if(tree->op == TCAT)
- tree = tree->left;
- if(tree->op == TBOL)
- return 2;
- return -1;
-}
-
static Reprog*
regcomp1(char *regstr, int nl, int lit)
{
return nil;
}
- maxthr = regstrlen;
+ maxthr = regstrlen + 1;
parsetr = node(&plex, TSUB, e0(&plex), nil);
// prtree(parsetr, 0, 1);
reprog = malloc(sizeof(Reprog) +
sizeof(Reinst) * plex.instrs +
- sizeof(Rethread) * maxthr +
- sizeof(Rethread*) * maxthr);
+ sizeof(Rethread) * maxthr);
reprog->len = plex.instrs;
reprog->nthr = maxthr;
reprog->startinst = compile(parsetr, reprog, nl);
reprog->threads = (Rethread*)(reprog->startinst + reprog->len);
- reprog->thrpool = (Rethread**)(reprog->threads + reprog->nthr);
reprog->regstr = regstr;
free(plex.nodes);
static Reinst*
compile(Renode *parsetr, Reprog *reprog, int nl)
{
- Reinst *reinst;
+ Reinst *reinst, *end;
int sub;
sub = 0;
reinst = (Reinst*)(reprog+1);
- compile1(parsetr, reinst, &sub, nl);
+ end = compile1(parsetr, reinst, &sub, nl);
+ assert(reinst + reprog->len == end);
return reinst;
}