summaryrefslogtreecommitdiff
path: root/lex-ere.y
blob: 7068886ae6a863025349d5d82e6dc9359e2ad101 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
%{
extern int yylex(void);
extern int yyerror(const char *s);
%}
%token ORD_CHAR QUOTED_CHAR DUP_COUNT
%token COLL_ELEM_SINGLE COLL_ELEM_MULTI META_CHAR
%token Open_equal Equal_close Open_dot Dot_close Open_colon Colon_close
%token class_name
%start extended_reg_exp
%%
extended_reg_exp	: ERE_branch
			| extended_reg_exp '|' ERE_branch
			;

ERE_branch		: ERE_expression
			| ERE_branch ERE_expression
			;

ERE_expression		: one_char_or_coll_elem_ERE
			| '^'
			| '$'
			| '(' extended_reg_exp ')'
			| ERE_expression ERE_dupl_symbol
			;

one_char_or_coll_elem_ERE : ORD_CHAR
			| QUOTED_CHAR
			| '.'
			| bracket_expression
			;

ERE_dupl_symbol		: '*'
			| '+'
			| '?'
			| '{' DUP_COUNT '}'
			| '{' DUP_COUNT ',' '}'
			| '{' DUP_COUNT ',' DUP_COUNT '}'
			;


/* bracket expression */
bracket_expression	: '[' matching_list ']'
			| '[' nonmatching_list ']'
			;

matching_list		: bracket_list
			;

nonmatching_list	: '^' bracket_list
			;

bracket_list		: follow_list
			| follow_list '-'
			;

follow_list		: expression_term
			| follow_list expression_term
			;

expression_term		: single_expression
			| range_expression
			;

single_expression	: end_range
			| character_class
			| equivalence_class
			;

range_expression	: start_range end_range
			| start_range '-'
			;

start_range		: end_range '-'
			;

end_range		: COLL_ELEM_SINGLE
			| collating_symbol
			;

collating_symbol	: Open_dot COLL_ELEM_SINGLE Dot_close
			| Open_dot COLL_ELEM_MULTI Dot_close
			| Open_dot META_CHAR Dot_close
			;

equivalence_class	: Open_equal COLL_ELEM_SINGLE Equal_close
			| Open_equal COLL_ELEM_MULTI Equal_close
			;

character_class		: Open_colon class_name Colon_close
			;