19 |
/* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
/* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
20 |
|
|
21 |
#include <stdio.h> |
#include <stdio.h> |
22 |
#include <malloc.h> |
#include <malloc.h> |
23 |
#include <stdlib.h> |
#include <stdlib.h> |
24 |
#include <string.h> |
#include <string.h> |
25 |
|
|
26 |
#include "dic.h" |
#include "dic.h" |
27 |
#include "dic_internals.h" |
#include "dic_internals.h" |
28 |
|
|
29 |
#include "dic.h" |
#include "dic.h" |
30 |
#include "regexp.h" |
#include "regexp.h" |
33 |
#include "scanner.h" |
#include "scanner.h" |
34 |
|
|
35 |
|
|
36 |
/** |
/** |
37 |
* function prototype for parser generated by bison |
* function prototype for parser generated by bison |
38 |
*/ |
*/ |
39 |
int regexpparse(yyscan_t scanner, NODE** root, |
int regexpparse(yyscan_t scanner, NODE** root, |
40 |
struct search_RegE_list_t *list, |
struct search_RegE_list_t *list, |
41 |
struct regexp_error_report_t *err); |
struct regexp_error_report_t *err); |
42 |
/** |
/** |
43 |
* function prototype for error reporting |
* function prototype for error reporting |
44 |
*/ |
*/ |
45 |
void regexperror(YYLTYPE *llocp, yyscan_t scanner, NODE** root, |
void regexperror(YYLTYPE *llocp, yyscan_t scanner, NODE** root, |
46 |
struct search_RegE_list_t *list, |
struct search_RegE_list_t *list, |
47 |
struct regexp_error_report_t *err, |
struct regexp_error_report_t *err, |
48 |
char const *msg); |
char const *msg); |
49 |
|
|
50 |
|
|
51 |
%} |
%} |
52 |
%union { |
%union { |
53 |
char c; |
char c; |
54 |
NODE *NODE_TYPE; |
NODE *NODE_TYPE; |
55 |
char letters[DIC_LETTERS]; |
char letters[DIC_LETTERS]; |
56 |
}; |
}; |
57 |
|
|
58 |
%defines |
%defines |
72 |
%token LEX_USER1 |
%token LEX_USER1 |
73 |
%token LEX_USER2 |
%token LEX_USER2 |
74 |
|
|
75 |
%token LEX_L_SQBRACKET LEX_R_SQBRACKET |
%token LEX_L_SQBRACKET LEX_R_SQBRACKET |
76 |
%token LEX_L_BRACKET LEX_R_BRACKET |
%token LEX_L_BRACKET LEX_R_BRACKET |
77 |
%token LEX_HAT |
%token LEX_HAT |
78 |
|
|
79 |
%token LEX_QMARK |
%token LEX_QMARK |
80 |
%token LEX_PLUS |
%token LEX_PLUS |
86 |
%type <letters> vardis |
%type <letters> vardis |
87 |
%type <letters> exprdis |
%type <letters> exprdis |
88 |
%type <NODE_TYPE> exprdisnode |
%type <NODE_TYPE> exprdisnode |
89 |
%start start |
%start start |
90 |
%% |
%% |
91 |
|
|
92 |
start: LEX_L_BRACKET expr LEX_R_BRACKET LEX_SHARP |
start: LEX_L_BRACKET expr LEX_R_BRACKET LEX_SHARP |
93 |
{ |
{ |
94 |
NODE* sharp = regexp_createNODE(NODE_VAR,RE_FINAL_TOK,NULL,NULL); |
NODE* sharp = regexp_createNODE(NODE_VAR,RE_FINAL_TOK,NULL,NULL); |
95 |
*root = regexp_createNODE(NODE_AND,'\0',$2,sharp); |
*root = regexp_createNODE(NODE_AND,'\0',$2,sharp); |
96 |
YYACCEPT; |
YYACCEPT; |
97 |
} |
} |
98 |
; |
; |
99 |
|
|
100 |
|
|
101 |
expr : var |
expr : var |
102 |
{ |
{ |
103 |
$$=$1; |
$$=$1; |
104 |
} |
} |
105 |
| expr expr |
| expr expr |
106 |
{ |
{ |
107 |
$$=regexp_createNODE(NODE_AND,'\0',$1,$2); |
$$=regexp_createNODE(NODE_AND,'\0',$1,$2); |
108 |
} |
} |
109 |
| var LEX_QMARK |
| var LEX_QMARK |
110 |
{ |
{ |
111 |
NODE* epsilon=regexp_createNODE(NODE_VAR,RE_EPSILON,NULL,NULL); |
NODE* epsilon=regexp_createNODE(NODE_VAR,RE_EPSILON,NULL,NULL); |
112 |
$$=regexp_createNODE(NODE_OR,'\0',$1,epsilon); |
$$=regexp_createNODE(NODE_OR,'\0',$1,epsilon); |
115 |
{ |
{ |
116 |
$$=regexp_createNODE(NODE_PLUS,'\0',$1,NULL); |
$$=regexp_createNODE(NODE_PLUS,'\0',$1,NULL); |
117 |
} |
} |
118 |
| var LEX_STAR |
| var LEX_STAR |
119 |
{ |
{ |
120 |
$$=regexp_createNODE(NODE_STAR,'\0',$1,NULL); |
$$=regexp_createNODE(NODE_STAR,'\0',$1,NULL); |
121 |
} |
} |
122 |
/* () */ |
/* () */ |
123 |
| LEX_L_BRACKET expr LEX_R_BRACKET |
| LEX_L_BRACKET expr LEX_R_BRACKET |
124 |
{ |
{ |
125 |
$$=$2; |
$$=$2; |
126 |
} |
} |
127 |
| LEX_L_BRACKET expr LEX_R_BRACKET LEX_QMARK |
| LEX_L_BRACKET expr LEX_R_BRACKET LEX_QMARK |
128 |
{ |
{ |
129 |
NODE* epsilon=regexp_createNODE(NODE_VAR,RE_EPSILON,NULL,NULL); |
NODE* epsilon=regexp_createNODE(NODE_VAR,RE_EPSILON,NULL,NULL); |
130 |
$$=regexp_createNODE(NODE_OR,'\0',$2,epsilon); |
$$=regexp_createNODE(NODE_OR,'\0',$2,epsilon); |
131 |
} |
} |
132 |
| LEX_L_BRACKET expr LEX_R_BRACKET LEX_PLUS |
| LEX_L_BRACKET expr LEX_R_BRACKET LEX_PLUS |
133 |
{ |
{ |
134 |
$$=regexp_createNODE(NODE_PLUS,'\0',$2,NULL); |
$$=regexp_createNODE(NODE_PLUS,'\0',$2,NULL); |
135 |
} |
} |
136 |
| LEX_L_BRACKET expr LEX_R_BRACKET LEX_STAR |
| LEX_L_BRACKET expr LEX_R_BRACKET LEX_STAR |
137 |
{ |
{ |
138 |
$$=regexp_createNODE(NODE_STAR,'\0',$2,NULL); |
$$=regexp_createNODE(NODE_STAR,'\0',$2,NULL); |
139 |
} |
} |
155 |
{ |
{ |
156 |
$$=regexp_createNODE(NODE_STAR,'\0',$2,NULL); |
$$=regexp_createNODE(NODE_STAR,'\0',$2,NULL); |
157 |
} |
} |
158 |
; |
; |
159 |
|
|
160 |
|
|
161 |
|
|
165 |
printf("var : lecture %c\n",$1 + 'a' -1); |
printf("var : lecture %c\n",$1 + 'a' -1); |
166 |
#endif |
#endif |
167 |
$$=regexp_createNODE(NODE_VAR,$1,NULL,NULL); |
$$=regexp_createNODE(NODE_VAR,$1,NULL,NULL); |
168 |
} |
} |
169 |
| LEX_ALL |
| LEX_ALL |
170 |
{ |
{ |
171 |
$$=regexp_createNODE(NODE_VAR,RE_ALL_MATCH,NULL,NULL); |
$$=regexp_createNODE(NODE_VAR,RE_ALL_MATCH,NULL,NULL); |
215 |
} |
} |
216 |
} |
} |
217 |
$$=regexp_createNODE(NODE_VAR,list->symbl[i],NULL,NULL); |
$$=regexp_createNODE(NODE_VAR,list->symbl[i],NULL,NULL); |
218 |
} |
} |
219 |
| LEX_HAT exprdis |
| LEX_HAT exprdis |
220 |
{ |
{ |
221 |
int i,j; |
int i,j; |
249 |
exprdis: vardis |
exprdis: vardis |
250 |
{ |
{ |
251 |
memcpy($$,$1,sizeof(char)*DIC_LETTERS); |
memcpy($$,$1,sizeof(char)*DIC_LETTERS); |
252 |
} |
} |
253 |
| vardis exprdis |
| vardis exprdis |
254 |
{ |
{ |
255 |
int i; |
int i; |
269 |
#endif |
#endif |
270 |
$$[c] = 1; |
$$[c] = 1; |
271 |
} |
} |
272 |
; |
; |
273 |
|
|
274 |
|
|
275 |
%% |
%% |
276 |
|
|
277 |
void regexperror(YYLTYPE *llocp, yyscan_t yyscanner, NODE** root, |
void regexperror(YYLTYPE *llocp, yyscan_t yyscanner, NODE** root, |
278 |
struct search_RegE_list_t *list, |
struct search_RegE_list_t *list, |
279 |
struct regexp_error_report_t *err, char const *msg) |
struct regexp_error_report_t *err, char const *msg) |
280 |
{ |
{ |
281 |
err->pos1 = llocp->first_column; |
err->pos1 = llocp->first_column; |