#ifndef re2c_dfa_h #define re2c_dfa_h #include #include "tools/re2c/re.h" extern void prtCh(FILE *, unsigned char); extern void printSpan(FILE *, unsigned int, unsigned int); struct DFA; struct State; typedef enum { MATCHACT = 1, ENTERACT, SAVEMATCHACT, MOVEACT, ACCEPTACT, RULEACT } ActionType; typedef struct Action { struct State *state; ActionType type; union { /* data for Enter */ unsigned int label; /* data for SaveMatch */ unsigned int selector; /* data for Accept */ struct { unsigned int nRules; unsigned int *saves; struct State **rules; } Accept; /* data for Rule */ RegExp *rule; /* RuleOp */ } d; } Action; void Action_emit(Action*, FILE *, int *); typedef struct Span { unsigned int ub; struct State *to; } Span; unsigned int Span_show(Span*, FILE *, unsigned int); typedef struct Go { unsigned int nSpans; Span *span; } Go; typedef struct State { unsigned int label; RegExp *rule; /* RuleOp */ struct State *next; struct State *link; unsigned int depth; /* for finding SCCs */ unsigned int kCount; Ins **kernel; unsigned int isBase:1; Go go; Action *action; } State; void Go_genGoto(Go*, FILE *, State*, State*, int*); void Go_genBase(Go*, FILE *, State*, State*, int*); void Go_genLinear(Go*, FILE *, State*, State*, int*); void Go_genBinary(Go*, FILE *, State*, State*, int*); void Go_genSwitch(Go*, FILE *, State*, State*, int*); void Go_compact(Go*); void Go_unmap(Go*, Go*, State*); State *State_new(void); void State_delete(State*); void State_emit(State*, FILE *, int *); void State_out(FILE *, const State*); typedef struct DFA { unsigned int lbChar; unsigned int ubChar; unsigned int nStates; State *head, **tail; State *toDo; } DFA; DFA *DFA_new(Ins*, unsigned int, unsigned int, unsigned int, Char*); void DFA_delete(DFA*); void DFA_addState(DFA*, State**, State*); State *DFA_findState(DFA*, Ins**, unsigned int); void DFA_split(DFA*, State*); void DFA_findSCCs(DFA*); void DFA_emit(DFA*, FILE *); void DFA_out(FILE *, const DFA*); static Action * Action_new_Match(State *s) { Action *a = malloc(sizeof(Action)); a->type = MATCHACT; a->state = s; s->action = a; return a; } static Action * Action_new_Enter(State *s, unsigned int l) { Action *a = malloc(sizeof(Action)); a->type = ENTERACT; a->state = s; a->d.label = l; s->action = a; return a; } static Action * Action_new_Save(State *s, unsigned int i) { Action *a = malloc(sizeof(Action)); a->type = SAVEMATCHACT; a->state = s; a->d.selector = i; s->action = a; return a; } static Action * Action_new_Move(State *s) { Action *a = malloc(sizeof(Action)); a->type = MOVEACT; a->state = s; s->action = a; return a; } Action *Action_new_Accept(State*, unsigned int, unsigned int*, State**); static Action * Action_new_Rule(State *s, RegExp *r) /* RuleOp */ { Action *a = malloc(sizeof(Action)); a->type = RULEACT; a->state = s; a->d.rule = r; s->action = a; return a; } static int Action_isRule(Action *a) { return a->type == RULEACT; } static int Action_isMatch(Action *a) { return a->type == MATCHACT; } static int Action_readAhead(Action *a) { return !Action_isMatch(a) || (a->state && a->state->next && !Action_isRule(a->state->next->action)); } #endif