mirror of https://github.com/yasm/yasm.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
2.8 KiB
154 lines
2.8 KiB
#ifndef re2c_dfa_h |
|
#define re2c_dfa_h |
|
|
|
#include <stdio.h> |
|
#include "re.h" |
|
|
|
extern void prtCh(FILE *, uchar); |
|
extern void printSpan(FILE *, uint, uint); |
|
|
|
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 */ |
|
uint label; |
|
/* data for SaveMatch */ |
|
uint selector; |
|
/* data for Accept */ |
|
struct { |
|
uint nRules; |
|
uint *saves; |
|
struct State **rules; |
|
} Accept; |
|
/* data for Rule */ |
|
RegExp *rule; /* RuleOp */ |
|
} d; |
|
} Action; |
|
|
|
void Action_emit(Action*, FILE *); |
|
|
|
typedef struct Span { |
|
uint ub; |
|
struct State *to; |
|
} Span; |
|
|
|
uint Span_show(Span*, FILE *, uint); |
|
|
|
typedef struct Go { |
|
uint nSpans; |
|
Span *span; |
|
} Go; |
|
|
|
typedef struct State { |
|
uint label; |
|
RegExp *rule; /* RuleOp */ |
|
struct State *next; |
|
struct State *link; |
|
uint depth; /* for finding SCCs */ |
|
uint kCount; |
|
Ins **kernel; |
|
uint isBase:1; |
|
Go go; |
|
Action *action; |
|
} State; |
|
|
|
void Go_genGoto(Go*, FILE *, State*); |
|
void Go_genBase(Go*, FILE *, State*); |
|
void Go_genLinear(Go*, FILE *, State*); |
|
void Go_genBinary(Go*, FILE *, State*); |
|
void Go_genSwitch(Go*, FILE *, State*); |
|
void Go_compact(Go*); |
|
void Go_unmap(Go*, Go*, State*); |
|
|
|
State *State_new(void); |
|
void State_delete(State*); |
|
void State_emit(State*, FILE *); |
|
void State_out(FILE *, const State*); |
|
|
|
typedef struct DFA { |
|
uint lbChar; |
|
uint ubChar; |
|
uint nStates; |
|
State *head, **tail; |
|
State *toDo; |
|
} DFA; |
|
|
|
DFA *DFA_new(Ins*, uint, uint, uint, Char*); |
|
void DFA_delete(DFA*); |
|
void DFA_addState(DFA*, State**, State*); |
|
State *DFA_findState(DFA*, Ins**, uint); |
|
void DFA_split(DFA*, State*); |
|
|
|
void DFA_findSCCs(DFA*); |
|
void DFA_emit(DFA*, FILE *); |
|
void DFA_out(FILE *, const DFA*); |
|
|
|
static inline Action * |
|
Action_new_Match(State *s) |
|
{ |
|
Action *a = malloc(sizeof(Action)); |
|
a->type = MATCHACT; |
|
a->state = s; |
|
s->action = a; |
|
return a; |
|
} |
|
|
|
static inline Action * |
|
Action_new_Enter(State *s, uint l) |
|
{ |
|
Action *a = malloc(sizeof(Action)); |
|
a->type = ENTERACT; |
|
a->state = s; |
|
a->d.label = l; |
|
s->action = a; |
|
return a; |
|
} |
|
|
|
static inline Action * |
|
Action_new_Save(State *s, uint i) |
|
{ |
|
Action *a = malloc(sizeof(Action)); |
|
a->type = SAVEMATCHACT; |
|
a->state = s; |
|
a->d.selector = i; |
|
s->action = a; |
|
return a; |
|
} |
|
|
|
static inline 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*, uint, uint*, State**); |
|
|
|
static inline 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; |
|
} |
|
|
|
#endif
|
|
|