174 lines
3.4 KiB
C
174 lines
3.4 KiB
C
|
#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
|