• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef re2c_re_h
2 #define re2c_re_h
3 
4 #include <stdio.h>
5 #include "tools/re2c/token.h"
6 #include "tools/re2c/ins.h"
7 
8 typedef struct extop {
9     char    op;
10     int	    minsize;
11     int	    maxsize;
12 } ExtOp;
13 
14 typedef struct CharPtn {
15     unsigned int	card;
16     struct CharPtn	*fix;
17     struct CharPtn	*nxt;
18 } CharPtn;
19 
20 typedef struct CharSet {
21     CharPtn	*fix;
22     CharPtn	*freeHead, **freeTail;
23     CharPtn	*rep[nChars];
24     CharPtn	ptn[nChars];
25 } CharSet;
26 
27 typedef struct Range {
28     struct Range	*next;
29     unsigned int	lb, ub;		/* [lb,ub) */
30 } Range;
31 
32 static void
Range_init(Range * r,unsigned int l,unsigned int u)33 Range_init(Range *r, unsigned int l, unsigned int u)
34 {
35     r->next = NULL;
36     r->lb = l;
37     r->ub = u;
38 }
39 
40 static Range *
Range_new(unsigned int l,unsigned int u)41 Range_new(unsigned int l, unsigned int u)
42 {
43     Range *r = malloc(sizeof(Range));
44     r->next = NULL;
45     r->lb = l;
46     r->ub = u;
47     return r;
48 }
49 
50 static void
Range_copy(Range * ro,const Range * r)51 Range_copy(Range *ro, const Range *r)
52 {
53     ro->next = NULL;
54     ro->lb = r->lb;
55     ro->ub = r->ub;
56 }
57 
58 static Range *
Range_new_copy(Range * r)59 Range_new_copy(Range *r)
60 {
61     Range *ro = malloc(sizeof(Range));
62     ro->next = NULL;
63     ro->lb = r->lb;
64     ro->ub = r->ub;
65     return ro;
66 }
67 
68 void Range_out(FILE *, const Range *);
69 
70 typedef enum {
71 	NULLOP = 1,
72 	MATCHOP,
73 	RULEOP,
74 	ALTOP,
75 	CATOP,
76 	CLOSEOP,
77 	CLOSEVOP
78 } RegExpType;
79 
80 typedef struct RegExp {
81     RegExpType	type;
82     unsigned int	size;
83     union {
84 	/* for MatchOp */
85 	Range	*match;
86 	/* for RuleOp */
87 	struct {
88 	    struct RegExp	*exp;
89 	    struct RegExp	*ctx;
90 	    Ins		*ins;
91 	    unsigned int	accept;
92 	    Token	*code;
93 	    unsigned int	line;
94 	} RuleOp;
95 	/* for AltOp and CatOp*/
96 	struct {
97 	    struct RegExp	*exp1, *exp2;
98 	} AltCatOp;
99 	/* for CloseOp */
100 	struct RegExp	*exp;
101 	/* for CloseVOp*/
102 	struct {
103 	    struct RegExp	*exp;
104 	    int		min;
105 	    int		max;
106 	} CloseVOp;
107     } d;
108 } RegExp;
109 
110 static RegExp *
RegExp_isA(RegExp * r,RegExpType t)111 RegExp_isA(RegExp *r, RegExpType t)
112 {
113     return r->type == t ? r : NULL;
114 }
115 
116 void RegExp_split(RegExp*, CharSet*);
117 void RegExp_calcSize(RegExp*, Char*);
118 unsigned int RegExp_fixedLength(RegExp*);
119 void RegExp_compile(RegExp*, Char*, Ins*);
120 void RegExp_display(RegExp*, FILE *);
121 
122 static RegExp *
RegExp_new_NullOp(void)123 RegExp_new_NullOp(void)
124 {
125     RegExp *r = malloc(sizeof(RegExp));
126     r->type = NULLOP;
127     return r;
128 }
129 
130 static RegExp *
RegExp_new_MatchOp(Range * m)131 RegExp_new_MatchOp(Range *m)
132 {
133     RegExp *r = malloc(sizeof(RegExp));
134     r->type = MATCHOP;
135     r->d.match = m;
136     return r;
137 }
138 
139 RegExp *RegExp_new_RuleOp(RegExp*, RegExp*, Token*, unsigned int);
140 
141 static RegExp *
RegExp_new_AltOp(RegExp * e1,RegExp * e2)142 RegExp_new_AltOp(RegExp *e1, RegExp *e2)
143 {
144     RegExp *r = malloc(sizeof(RegExp));
145     r->type = ALTOP;
146     r->d.AltCatOp.exp1 = e1;
147     r->d.AltCatOp.exp2 = e2;
148     return r;
149 }
150 
151 static RegExp *
RegExp_new_CatOp(RegExp * e1,RegExp * e2)152 RegExp_new_CatOp(RegExp *e1, RegExp *e2)
153 {
154     RegExp *r = malloc(sizeof(RegExp));
155     r->type = CATOP;
156     r->d.AltCatOp.exp1 = e1;
157     r->d.AltCatOp.exp2 = e2;
158     return r;
159 }
160 
161 static RegExp *
RegExp_new_CloseOp(RegExp * e)162 RegExp_new_CloseOp(RegExp *e)
163 {
164     RegExp *r = malloc(sizeof(RegExp));
165     r->type = CLOSEOP;
166     r->d.exp = e;
167     return r;
168 }
169 
170 static RegExp *
RegExp_new_CloseVOp(RegExp * e,int lb,int ub)171 RegExp_new_CloseVOp(RegExp *e, int lb, int ub)
172 {
173     RegExp *r = malloc(sizeof(RegExp));
174     r->type = CLOSEVOP;
175     r->d.CloseVOp.exp = e;
176     r->d.CloseVOp.min = lb;
177     r->d.CloseVOp.max = ub;
178     return r;
179 }
180 
181 extern void genCode(FILE *, RegExp*);
182 extern RegExp *mkDiff(RegExp*, RegExp*);
183 extern RegExp *mkDot(void);
184 extern RegExp *strToRE(SubStr);
185 extern RegExp *strToCaseInsensitiveRE(SubStr);
186 extern RegExp *ranToRE(SubStr);
187 extern RegExp *invToRE(SubStr);
188 
189 extern RegExp *mkAlt(RegExp*, RegExp*);
190 
191 #endif
192