pegex 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,271 @@
1
+ require './test/lib/test_pegex'
2
+
3
+ TestML.require_or_skip 'psych'
4
+
5
+ TestML.run do |t|
6
+ t.eval '*grammar.compile.yaml.clean == *yaml'
7
+ end
8
+
9
+ TestML.data <<'...'
10
+ === Empty Grammar
11
+ --- grammar
12
+ --- yaml
13
+ {}
14
+
15
+ === Simple Grammar
16
+ --- grammar
17
+ a: ( <b> <c>* )+
18
+ b: /x/
19
+ c: <x>
20
+
21
+ --- yaml
22
+ a:
23
+ +min: 1
24
+ .all:
25
+ - .ref: b
26
+ - +min: 0
27
+ .ref: c
28
+ b:
29
+ .rgx: x
30
+ c:
31
+ .ref: x
32
+
33
+ === Single Rule Reference
34
+ --- grammar
35
+ a: <x>
36
+ --- yaml
37
+ a:
38
+ .ref: x
39
+
40
+ === Single Rule with no brackets
41
+ --- grammar
42
+ a: x
43
+ --- yaml
44
+ a:
45
+ .ref: x
46
+
47
+ === Single Rule With Trailing Quantifier
48
+ --- grammar
49
+ a: <x>*
50
+ --- yaml
51
+ a:
52
+ +min: 0
53
+ .ref: x
54
+
55
+ === Single Rule With Trailing Quantifier (no angles)
56
+ --- grammar
57
+ a: x*
58
+ --- yaml
59
+ a:
60
+ +min: 0
61
+ .ref: x
62
+
63
+ === Single Rule With Leading Assertion
64
+ --- grammar
65
+ a: =<x>
66
+ --- yaml
67
+ a:
68
+ +asr: 1
69
+ .ref: x
70
+
71
+ === Negative and Positive Assertion
72
+ --- grammar
73
+ a: !<b> =<c>
74
+ --- yaml
75
+ a:
76
+ .all:
77
+ - +asr: -1
78
+ .ref: b
79
+ - +asr: 1
80
+ .ref: c
81
+
82
+ === Single Regex
83
+ --- grammar
84
+ a: /x/
85
+ --- yaml
86
+ a:
87
+ .rgx: x
88
+
89
+ === Single Error
90
+ --- grammar
91
+ a: `x`
92
+ --- yaml
93
+ a:
94
+ .err: x
95
+
96
+ === Skip and Wrap Marker
97
+ --- grammar
98
+ a: .<b> +<c>+ -<d>?
99
+ --- yaml
100
+ a:
101
+ .all:
102
+ - -skip: 1
103
+ .ref: b
104
+ - +min: 1
105
+ -wrap: 1
106
+ .ref: c
107
+ - +max: 1
108
+ -pass: 1
109
+ .ref: d
110
+
111
+ === Unbracketed All Group
112
+ --- grammar
113
+ a: /x/ <y>
114
+ --- yaml
115
+ a:
116
+ .all:
117
+ - .rgx: x
118
+ - .ref: y
119
+
120
+ === Unbracketed Any Group
121
+ --- grammar
122
+ a: /x/ | <y> | `z`
123
+ --- yaml
124
+ a:
125
+ .any:
126
+ - .rgx: x
127
+ - .ref: y
128
+ - .err: z
129
+
130
+ === Bracketed All Group
131
+ --- grammar
132
+ a: ( <x> <y> )
133
+ --- yaml
134
+ a:
135
+ .all:
136
+ - .ref: x
137
+ - .ref: y
138
+
139
+ === Bracketed Group With Trailing Modifier
140
+ --- grammar
141
+ a: ( <x> <y> )?
142
+ --- yaml
143
+ a:
144
+ +max: 1
145
+ .all:
146
+ - .ref: x
147
+ - .ref: y
148
+
149
+ === Bracketed Group With Leading Modifier
150
+ --- grammar
151
+ a: .( =<x> <y> )
152
+ --- yaml
153
+ a:
154
+ -skip: 1
155
+ .all:
156
+ - +asr: 1
157
+ .ref: x
158
+ - .ref: y
159
+
160
+ === Multiple Groups
161
+ --- grammar
162
+ a: ( <x> <y> ) ( <z> | /zzz/ )
163
+ --- yaml
164
+ a:
165
+ .all:
166
+ - .all:
167
+ - .ref: x
168
+ - .ref: y
169
+ - .any:
170
+ - .ref: z
171
+ - .rgx: zzz
172
+
173
+ === List Separator
174
+ --- grammar
175
+ a: <b> | <c>? %% /d/
176
+ --- yaml
177
+ a:
178
+ .any:
179
+ - .ref: b
180
+ - +max: 1
181
+ .ref: c
182
+ .sep:
183
+ +eok: 1
184
+ .rgx: d
185
+
186
+ === Separators with Quantifiers
187
+ --- grammar
188
+ a: <b>2+ % <c>* <d>* %% <e>2-3
189
+ --- yaml
190
+ a:
191
+ .all:
192
+ - +min: 2
193
+ .ref: b
194
+ .sep:
195
+ +min: 0
196
+ .ref: c
197
+ - +min: 0
198
+ .ref: d
199
+ .sep:
200
+ +eok: 1
201
+ +max: 3
202
+ +min: 2
203
+ .ref: e
204
+
205
+ === All Quantifier Forms
206
+ --- grammar
207
+ a: <b> <c>? <d>* <e>+ <f>55 <g>5+ <h>5-55
208
+ --- yaml
209
+ a:
210
+ .all:
211
+ - .ref: b
212
+ - +max: 1
213
+ .ref: c
214
+ - +min: 0
215
+ .ref: d
216
+ - +min: 1
217
+ .ref: e
218
+ - +max: 55
219
+ +min: 55
220
+ .ref: f
221
+ - +min: 5
222
+ .ref: g
223
+ - +max: 55
224
+ +min: 5
225
+ .ref: h
226
+
227
+ === Whitespace in Regex
228
+ --- grammar
229
+ a: /<DOT>* (<DASH>{3})
230
+ <BANG> <BANG>
231
+ /
232
+ --- yaml
233
+ a:
234
+ .rgx: \.*(\-{3})!!
235
+
236
+ === Directives
237
+ --- grammar
238
+ \%grammar foo
239
+ \%version 1.2.3
240
+
241
+ --- yaml
242
+ +grammar: foo
243
+ +version: 1.2.3
244
+
245
+ === Multiple Duplicate Directives
246
+ --- grammar
247
+ \%grammar foo
248
+ \%include bar
249
+ \%include baz
250
+
251
+ --- yaml
252
+ +grammar: foo
253
+ +include:
254
+ - bar
255
+ - baz
256
+
257
+ === Meta Lines
258
+ --- grammar
259
+ %grammar foo
260
+ %version 1.1.1
261
+ %extends bar bar
262
+ %include bazzy
263
+ a: /b/
264
+ --- yaml
265
+ +extends: bar bar
266
+ +grammar: foo
267
+ +include: bazzy
268
+ +version: 1.1.1
269
+ a:
270
+ .rgx: b
271
+ ...
@@ -0,0 +1,271 @@
1
+ #!/usr/bin/env testml
2
+
3
+ %TestML 1.0
4
+
5
+ Plan = 50;
6
+
7
+ *grammar.compile.yaml.clean == *yaml;
8
+
9
+ testml_data <<'...'
10
+ === Empty Grammar
11
+ --- grammar
12
+ --- yaml
13
+ {}
14
+
15
+ === Simple Grammar
16
+ --- grammar
17
+ a: ( <b> <c>* )+
18
+ b: /x/
19
+ c: <x>
20
+
21
+ --- yaml
22
+ a:
23
+ +min: 1
24
+ .all:
25
+ - .ref: b
26
+ - +min: 0
27
+ .ref: c
28
+ b:
29
+ .rgx: x
30
+ c:
31
+ .ref: x
32
+
33
+ === Single Rule Reference
34
+ --- grammar
35
+ a: <x>
36
+ --- yaml
37
+ a:
38
+ .ref: x
39
+
40
+ === Single Rule with no brackets
41
+ --- grammar
42
+ a: x
43
+ --- yaml
44
+ a:
45
+ .ref: x
46
+
47
+ === Single Rule With Trailing Quantifier
48
+ --- grammar
49
+ a: <x>*
50
+ --- yaml
51
+ a:
52
+ +min: 0
53
+ .ref: x
54
+
55
+ === Single Rule With Trailing Quantifier (no angles)
56
+ --- grammar
57
+ a: x*
58
+ --- yaml
59
+ a:
60
+ +min: 0
61
+ .ref: x
62
+
63
+ === Single Rule With Leading Assertion
64
+ --- grammar
65
+ a: =<x>
66
+ --- yaml
67
+ a:
68
+ +asr: 1
69
+ .ref: x
70
+
71
+ === Negative and Positive Assertion
72
+ --- grammar
73
+ a: !<b> =<c>
74
+ --- yaml
75
+ a:
76
+ .all:
77
+ - +asr: -1
78
+ .ref: b
79
+ - +asr: 1
80
+ .ref: c
81
+
82
+ === Single Regex
83
+ --- grammar
84
+ a: /x/
85
+ --- yaml
86
+ a:
87
+ .rgx: x
88
+
89
+ === Single Error
90
+ --- grammar
91
+ a: `x`
92
+ --- yaml
93
+ a:
94
+ .err: x
95
+
96
+ === Skip and Wrap Marker
97
+ --- grammar
98
+ a: .<b> +<c>+ -<d>?
99
+ --- yaml
100
+ a:
101
+ .all:
102
+ - -skip: 1
103
+ .ref: b
104
+ - +min: 1
105
+ -wrap: 1
106
+ .ref: c
107
+ - +max: 1
108
+ -pass: 1
109
+ .ref: d
110
+
111
+ === Unbracketed All Group
112
+ --- grammar
113
+ a: /x/ <y>
114
+ --- yaml
115
+ a:
116
+ .all:
117
+ - .rgx: x
118
+ - .ref: y
119
+
120
+ === Unbracketed Any Group
121
+ --- grammar
122
+ a: /x/ | <y> | `z`
123
+ --- yaml
124
+ a:
125
+ .any:
126
+ - .rgx: x
127
+ - .ref: y
128
+ - .err: z
129
+
130
+ === Bracketed All Group
131
+ --- grammar
132
+ a: ( <x> <y> )
133
+ --- yaml
134
+ a:
135
+ .all:
136
+ - .ref: x
137
+ - .ref: y
138
+
139
+ === Bracketed Group With Trailing Modifier
140
+ --- grammar
141
+ a: ( <x> <y> )?
142
+ --- yaml
143
+ a:
144
+ +max: 1
145
+ .all:
146
+ - .ref: x
147
+ - .ref: y
148
+
149
+ === Bracketed Group With Leading Modifier
150
+ --- grammar
151
+ a: .( =<x> <y> )
152
+ --- yaml
153
+ a:
154
+ -skip: 1
155
+ .all:
156
+ - +asr: 1
157
+ .ref: x
158
+ - .ref: y
159
+
160
+ === Multiple Groups
161
+ --- grammar
162
+ a: ( <x> <y> ) ( <z> | /zzz/ )
163
+ --- yaml
164
+ a:
165
+ .all:
166
+ - .all:
167
+ - .ref: x
168
+ - .ref: y
169
+ - .any:
170
+ - .ref: z
171
+ - .rgx: zzz
172
+
173
+ === List Separator
174
+ --- grammar
175
+ a: <b> | <c>? %% /d/
176
+ --- yaml
177
+ a:
178
+ .any:
179
+ - .ref: b
180
+ - +max: 1
181
+ .ref: c
182
+ .sep:
183
+ +eok: 1
184
+ .rgx: d
185
+
186
+ === Separators with Quantifiers
187
+ --- grammar
188
+ a: <b>2+ % <c>* <d>* %% <e>2-3
189
+ --- yaml
190
+ a:
191
+ .all:
192
+ - +min: 2
193
+ .ref: b
194
+ .sep:
195
+ +min: 0
196
+ .ref: c
197
+ - +min: 0
198
+ .ref: d
199
+ .sep:
200
+ +eok: 1
201
+ +max: 3
202
+ +min: 2
203
+ .ref: e
204
+
205
+ === All Quantifier Forms
206
+ --- grammar
207
+ a: <b> <c>? <d>* <e>+ <f>55 <g>5+ <h>5-55
208
+ --- yaml
209
+ a:
210
+ .all:
211
+ - .ref: b
212
+ - +max: 1
213
+ .ref: c
214
+ - +min: 0
215
+ .ref: d
216
+ - +min: 1
217
+ .ref: e
218
+ - +max: 55
219
+ +min: 55
220
+ .ref: f
221
+ - +min: 5
222
+ .ref: g
223
+ - +max: 55
224
+ +min: 5
225
+ .ref: h
226
+
227
+ === Whitespace in Regex
228
+ --- grammar
229
+ a: /<DOT>* (<DASH>{3})
230
+ <BANG> <BANG>
231
+ /
232
+ --- yaml
233
+ a:
234
+ .rgx: \.*(\-{3})!!
235
+
236
+ === Directives
237
+ --- grammar
238
+ \%grammar foo
239
+ \%version 1.2.3
240
+
241
+ --- yaml
242
+ +grammar: foo
243
+ +version: 1.2.3
244
+
245
+ === Multiple Duplicate Directives
246
+ --- grammar
247
+ \%grammar foo
248
+ \%include bar
249
+ \%include baz
250
+
251
+ --- yaml
252
+ +grammar: foo
253
+ +include:
254
+ - bar
255
+ - baz
256
+
257
+ === Meta Lines
258
+ --- grammar
259
+ %grammar foo
260
+ %version 1.1.1
261
+ %extends bar bar
262
+ %include bazzy
263
+ a: /b/
264
+ --- yaml
265
+ +extends: bar bar
266
+ +grammar: foo
267
+ +include: bazzy
268
+ +version: 1.1.1
269
+ a:
270
+ .rgx: b
271
+ ...
@@ -0,0 +1,79 @@
1
+ require './test/lib/test_pegex'
2
+
3
+ TestML.require_or_skip 'psych'
4
+
5
+ TestML.run do |t|
6
+ t.eval '*grammar1.compile.yaml == *grammar2.compile.yaml'
7
+ end
8
+
9
+ TestML.data <<'...'
10
+ === Simple Test Case
11
+ --- grammar1
12
+ a: /x/
13
+ --- grammar2
14
+ a:
15
+ /x/
16
+
17
+ === And over Or Precedence
18
+ --- grammar1
19
+ a: b c | d
20
+ --- grammar2
21
+ a: ( b c ) | d
22
+
23
+ === And/Or Precedence with joining
24
+ --- grammar1
25
+ a: b % c | d %% e
26
+ --- grammar2
27
+ a: ( b % c ) | ( d %% e )
28
+
29
+ === And/Or Precedence with grouping
30
+ --- grammar1
31
+ a:
32
+ b c
33
+ | (
34
+ d
35
+ | e
36
+ | f g h i
37
+ )
38
+ --- grammar2
39
+ a: ( b c ) | ( d | e | ( f g h i ) )
40
+
41
+ === In-Line Comments
42
+ --- grammar1
43
+ a: # test
44
+ b c # not d
45
+ /q/ # skipping to q
46
+ % e # using e here...
47
+ ; # comment -> semicolon test
48
+ --- grammar2
49
+ a: b c /q/ % e
50
+
51
+ === Token Per Line
52
+ --- SKIP: TODO
53
+ --- grammar1
54
+ a: /b/
55
+ --- grammar2
56
+ a
57
+ :
58
+ /b/
59
+
60
+ === Regex Combination
61
+ --- SKIP: TODO
62
+ --- grammar1: a: /b/ /c/
63
+ --- grammar2: a: /bc/
64
+
65
+ === Regex Combination by Reference
66
+ --- SKIP: TODO
67
+ --- grammar1
68
+ a: b /c/
69
+ b: /b/
70
+ --- grammar2: a: /bc/
71
+
72
+ === Multiple Rules Names per Definition
73
+ --- SKIP: TODO
74
+ --- grammar1
75
+ a b: /O HAI/
76
+ --- grammar2
77
+ a: /O HAI/
78
+ b: /O HAI/
79
+ ...
data/test/compiler.rb ADDED
@@ -0,0 +1,42 @@
1
+ require './test/lib/test_pegex'
2
+
3
+ TestML.require_or_skip 'psych'
4
+
5
+ TestML.data 'test/compiler.tml'
6
+
7
+ TestML.run do |t|
8
+ t.eval '*grammar', t.method('run_compiler_tests')
9
+ end
10
+
11
+ class TestPegex
12
+ def run_compiler_tests block, expr=nil
13
+ label '$BlockLabel - Compiler output matches bootstrap?'
14
+ run_test(
15
+ block,
16
+ '*grammar.compile.yaml == *grammar.compile.yaml',
17
+ )
18
+
19
+ label '$BlockLabel - Compressed grammar compiles the same?'
20
+ run_test(
21
+ block,
22
+ '*grammar.compress.compile.yaml == *grammar.compress.compile.yaml',
23
+ )
24
+
25
+ label '$BlockLabel - Compressed grammar matches uncompressed?'
26
+ run_test(
27
+ block,
28
+ '*grammar.compress.compile.yaml == *grammar.compile.yaml',
29
+ )
30
+ end
31
+
32
+ def compress grammar_text
33
+ grammar_text.gsub! /([^;])\n(\w+\s*:)/ do |m|
34
+ "#{$1};#{$2}"
35
+ end
36
+ grammar_text.gsub! /\s/, ''
37
+
38
+ # XXX mod/quant ERROR rules are too prtective here:
39
+ grammar_text.gsub! />%</, '> % <'
40
+ return "#{grammar_text}\n"
41
+ end
42
+ end