blob: da4d6736350ad7487055425f883e2773cbb97444 [file] [log] [blame]
#ifndef re2c_dfa_h
#define re2c_dfa_h
#include <stdio.h>
#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