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);
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(end <= reinst + reprog->len);
return reinst;
}
{
l->literal = 0;
if(l->done) {
- l->rune = 0;
+ l->rune = L'\0';
return;
}
l->rawexp += chartorune(&l->rune, l->rawexp);
- if(l->rune == L'\\') {
- l->rawexp += chartorune(&l->rune, l->rawexp);
- l->literal = 1;
- }
if(*l->rawexp == 0)
l->done = 1;
- return;
+ if(l->rune == L'\\')
+ getnextrlit(l);
}
static void
l->literal = 1;
if(l->done) {
l->literal = 0;
- l->rune = 0;
+ l->rune = L'\0';
return;
}
l->rawexp += chartorune(&l->rune, l->rawexp);
if(*l->rawexp == 0)
l->done = 1;
- return;
}
static int
if(l->literal)
return l->peeklex = LRUNE;
switch(l->rune){
- case 0:
+ case L'\0':
return l->peeklex = LEND;
case L'*':
case L'?':
static int
pcmp(void *va, void *vb)
{
- vlong n;
Rune *a, *b;
a = va;
b = vb;
- n = (vlong)b[0] - (vlong)a[0];
- if(n)
- return n;
- return (vlong)b[1] - (vlong)a[1];
+ if(a[0] < b[0])
+ return 1;
+ if(a[0] > b[0])
+ return -1;
+ if(a[1] < b[1])
+ return 1;
+ if(a[1] > b[1])
+ return -1;
+ return 0;
}
static void
q[2] = 0;
}
-/* classes are in descending order */
+/* classes are in descending order see pcmp */
static Renode*
buildclassn(Parselex *l)
{
}
return n;
}
+
+static void
+prtree(Renode *tree, int d, int f)
+{
+ int i;
+
+ if(tree == nil)
+ return;
+ if(f)
+ for(i = 0; i < d; i++)
+ print("\t");
+ switch(tree->op) {
+ case TCAT:
+ prtree(tree->left, d, 0);
+ prtree(tree->right, d, 1);
+ break;
+ case TOR:
+ print("TOR\n");
+ prtree(tree->left, d+1, 1);
+ for(i = 0; i < d; i++)
+ print("\t");
+ print("|\n");
+ prtree(tree->right, d+1, 1);
+ break;
+ case TSTAR:
+ print("*\n");
+ prtree(tree->left, d+1, 1);
+ break;
+ case TPLUS:
+ print("+\n");
+ prtree(tree->left, d+1, 1);
+ break;
+ case TQUES:
+ print("?\n");
+ prtree(tree->left, d+1, 1);
+ break;
+ case TANY:
+ print(".\n");
+ prtree(tree->left, d+1, 1);
+ break;
+ case TBOL:
+ print("^\n");
+ break;
+ case TEOL:
+ print("$\n");
+ break;
+ case TSUB:
+ print("TSUB\n");
+ prtree(tree->left, d+1, 1);
+ break;
+ case TRUNE:
+ print("TRUNE: %C\n", tree->r);
+ break;
+ case TNOTNL:
+ print("TNOTNL: !\\n\n");
+ break;
+ case TCLASS:
+ print("CLASS: %C-%C\n", tree->r, tree->r1);
+ prtree(tree->left, d, 1);
+ break;
+ }
+}