plan9front/sys/src/libregexp/regimpl.h

93 lines
1.3 KiB
C

enum {
LANY = 0,
LBOL,
LCLASS,
LEND,
LEOL,
LLPAR,
LOR,
LREP,
LRPAR,
LRUNE,
TANY = 0,
TBOL,
TCAT,
TCLASS,
TEOL,
TNOTNL,
TOR,
TPLUS,
TQUES,
TRUNE,
TSTAR,
TSUB,
NSUBEXPM = 32,
};
typedef struct Parselex Parselex;
typedef struct Renode Renode;
struct Parselex {
/* Parse */
Renode *next, *nodes;
int sub, instrs;
jmp_buf exitenv;
/* Lex */
void (*getnextr)(Parselex*);
char *rawexp, *orig;
Rune rune;
int peek, peeklex, done, literal, nc;
Rune cpairs[400+2];
};
struct Renode {
int op;
Renode *left;
Rune r;
union {
Rune r1;
int sub;
Renode *right;
};
int nclass;
};
struct Rethread {
Reinst *i;
Resub sem[NSUBEXPM];
Rethread *next;
int gen;
};
struct Reinst {
char op;
int gen;
Reinst *a;
union {
Rune r;
int sub;
};
union {
Rune r1;
Reinst *b;
};
};
static int lex(Parselex*);
static void getnextr(Parselex*);
static void getnextrlit(Parselex*);
static void getclass(Parselex*);
static Renode *e0(Parselex*);
static Renode *e1(Parselex*);
static Renode *e2(Parselex*);
static Renode *e3(Parselex*);
static Renode *buildclass(Parselex*);
static Renode *buildclassn(Parselex*);
static int pcmp(void*, void*);
static Reprog *regcomp1(char*, int, int);
static Reinst *compile(Renode*, Reprog*, int);
static Reinst *compile1(Renode*, Reinst*, int*, int);
static void prtree(Renode*, int, int);