cognita-treetop 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. data/README +164 -0
  2. data/Rakefile +35 -0
  3. data/bin/tt +25 -0
  4. data/doc/contributing_and_planned_features.markdown +103 -0
  5. data/doc/grammar_composition.markdown +65 -0
  6. data/doc/index.markdown +90 -0
  7. data/doc/pitfalls_and_advanced_techniques.markdown +51 -0
  8. data/doc/semantic_interpretation.markdown +189 -0
  9. data/doc/site.rb +110 -0
  10. data/doc/sitegen.rb +60 -0
  11. data/doc/syntactic_recognition.markdown +100 -0
  12. data/doc/using_in_ruby.markdown +21 -0
  13. data/examples/lambda_calculus/arithmetic.rb +551 -0
  14. data/examples/lambda_calculus/arithmetic.treetop +97 -0
  15. data/examples/lambda_calculus/arithmetic_node_classes.rb +7 -0
  16. data/examples/lambda_calculus/arithmetic_test.rb +54 -0
  17. data/examples/lambda_calculus/lambda_calculus +0 -0
  18. data/examples/lambda_calculus/lambda_calculus.rb +718 -0
  19. data/examples/lambda_calculus/lambda_calculus.treetop +132 -0
  20. data/examples/lambda_calculus/lambda_calculus_node_classes.rb +5 -0
  21. data/examples/lambda_calculus/lambda_calculus_test.rb +89 -0
  22. data/examples/lambda_calculus/test_helper.rb +18 -0
  23. data/lib/treetop.rb +8 -0
  24. data/lib/treetop/bootstrap_gen_1_metagrammar.rb +45 -0
  25. data/lib/treetop/compiler.rb +6 -0
  26. data/lib/treetop/compiler/grammar_compiler.rb +40 -0
  27. data/lib/treetop/compiler/lexical_address_space.rb +17 -0
  28. data/lib/treetop/compiler/metagrammar.rb +2887 -0
  29. data/lib/treetop/compiler/metagrammar.treetop +404 -0
  30. data/lib/treetop/compiler/node_classes.rb +19 -0
  31. data/lib/treetop/compiler/node_classes/anything_symbol.rb +18 -0
  32. data/lib/treetop/compiler/node_classes/atomic_expression.rb +14 -0
  33. data/lib/treetop/compiler/node_classes/character_class.rb +19 -0
  34. data/lib/treetop/compiler/node_classes/choice.rb +31 -0
  35. data/lib/treetop/compiler/node_classes/declaration_sequence.rb +24 -0
  36. data/lib/treetop/compiler/node_classes/grammar.rb +28 -0
  37. data/lib/treetop/compiler/node_classes/inline_module.rb +27 -0
  38. data/lib/treetop/compiler/node_classes/nonterminal.rb +13 -0
  39. data/lib/treetop/compiler/node_classes/optional.rb +19 -0
  40. data/lib/treetop/compiler/node_classes/parenthesized_expression.rb +9 -0
  41. data/lib/treetop/compiler/node_classes/parsing_expression.rb +138 -0
  42. data/lib/treetop/compiler/node_classes/parsing_rule.rb +55 -0
  43. data/lib/treetop/compiler/node_classes/predicate.rb +45 -0
  44. data/lib/treetop/compiler/node_classes/repetition.rb +55 -0
  45. data/lib/treetop/compiler/node_classes/sequence.rb +68 -0
  46. data/lib/treetop/compiler/node_classes/terminal.rb +20 -0
  47. data/lib/treetop/compiler/node_classes/transient_prefix.rb +9 -0
  48. data/lib/treetop/compiler/node_classes/treetop_file.rb +9 -0
  49. data/lib/treetop/compiler/ruby_builder.rb +113 -0
  50. data/lib/treetop/ruby_extensions.rb +2 -0
  51. data/lib/treetop/ruby_extensions/string.rb +42 -0
  52. data/lib/treetop/runtime.rb +5 -0
  53. data/lib/treetop/runtime/compiled_parser.rb +87 -0
  54. data/lib/treetop/runtime/interval_skip_list.rb +4 -0
  55. data/lib/treetop/runtime/interval_skip_list/head_node.rb +15 -0
  56. data/lib/treetop/runtime/interval_skip_list/interval_skip_list.rb +200 -0
  57. data/lib/treetop/runtime/interval_skip_list/node.rb +164 -0
  58. data/lib/treetop/runtime/syntax_node.rb +72 -0
  59. data/lib/treetop/runtime/terminal_parse_failure.rb +16 -0
  60. data/lib/treetop/runtime/terminal_syntax_node.rb +17 -0
  61. metadata +119 -0
@@ -0,0 +1,404 @@
1
+ module Treetop
2
+ module Compiler
3
+ grammar Metagrammar
4
+ rule treetop_file
5
+ prefix:space? module_or_grammar:(module_declaration / grammar) suffix:space? {
6
+ def compile
7
+ prefix.text_value + module_or_grammar.compile + suffix.text_value
8
+ end
9
+ }
10
+ end
11
+
12
+ rule module_declaration
13
+ prefix:('module' space [A-Z] alphanumeric_char* space) module_contents:(module_declaration / grammar) suffix:(space 'end') {
14
+ def compile
15
+ prefix.text_value + module_contents.compile + suffix.text_value
16
+ end
17
+ }
18
+ end
19
+
20
+ rule grammar
21
+ 'grammar' space grammar_name space declaration_sequence space? 'end' <Grammar>
22
+ end
23
+
24
+ rule grammar_name
25
+ ([A-Z] alphanumeric_char*)
26
+ end
27
+
28
+ rule declaration_sequence
29
+ head:declaration tail:(space declaration)* <DeclarationSequence> {
30
+ def declarations
31
+ [head] + tail
32
+ end
33
+
34
+ def tail
35
+ super.elements.map { |elt| elt.declaration }
36
+ end
37
+ }
38
+ /
39
+ '' {
40
+ def compile(builder)
41
+ end
42
+ }
43
+ end
44
+
45
+ rule declaration
46
+ parsing_rule / include_declaration
47
+ end
48
+
49
+ rule include_declaration
50
+ 'include' space [A-Z] (alphanumeric_char / '::')* {
51
+ def compile(builder)
52
+ builder << text_value
53
+ end
54
+ }
55
+ end
56
+
57
+ rule parsing_rule
58
+ 'rule' space nonterminal space parsing_expression space 'end' <ParsingRule>
59
+ end
60
+
61
+ rule parsing_expression
62
+ choice / sequence / primary
63
+ end
64
+
65
+ rule choice
66
+ head:alternative tail:(space? '/' space? alternative)+ <Choice> {
67
+ def alternatives
68
+ [head] + tail
69
+ end
70
+
71
+ def tail
72
+ super.elements.map {|elt| elt.alternative}
73
+ end
74
+
75
+ def inline_modules
76
+ (alternatives.map {|alt| alt.inline_modules }).flatten
77
+ end
78
+ }
79
+ end
80
+
81
+ rule sequence
82
+ head:labeled_sequence_primary tail:(space labeled_sequence_primary)+ node_class_declarations <Sequence> {
83
+ def sequence_elements
84
+ [head] + tail
85
+ end
86
+
87
+ def tail
88
+ super.elements.map {|elt| elt.labeled_sequence_primary }
89
+ end
90
+
91
+ def inline_modules
92
+ (sequence_elements.map {|elt| elt.inline_modules}).flatten +
93
+ [sequence_element_accessor_module] +
94
+ node_class_declarations.inline_modules
95
+ end
96
+
97
+ def inline_module_name
98
+ node_class_declarations.inline_module_name
99
+ end
100
+ }
101
+ end
102
+
103
+ rule alternative
104
+ sequence / primary
105
+ end
106
+
107
+ rule primary
108
+ prefix atomic {
109
+ def compile(address, builder, parent_expression=nil)
110
+ prefix.compile(address, builder, self)
111
+ end
112
+
113
+ def prefixed_expression
114
+ atomic
115
+ end
116
+
117
+ def inline_modules
118
+ atomic.inline_modules
119
+ end
120
+
121
+ def inline_module_name
122
+ nil
123
+ end
124
+ }
125
+ /
126
+ atomic suffix node_class_declarations {
127
+ def compile(address, builder, parent_expression=nil)
128
+ suffix.compile(address, builder, self)
129
+ end
130
+
131
+ def optional_expression
132
+ atomic
133
+ end
134
+
135
+ def node_class_name
136
+ node_class_declarations.node_class_name
137
+ end
138
+
139
+ def inline_modules
140
+ atomic.inline_modules + node_class_declarations.inline_modules
141
+ end
142
+
143
+ def inline_module_name
144
+ node_class_declarations.inline_module_name
145
+ end
146
+ }
147
+ /
148
+ atomic node_class_declarations {
149
+ def compile(address, builder, parent_expression=nil)
150
+ atomic.compile(address, builder, self)
151
+ end
152
+
153
+ def node_class_name
154
+ node_class_declarations.node_class_name
155
+ end
156
+
157
+ def inline_modules
158
+ atomic.inline_modules + node_class_declarations.inline_modules
159
+ end
160
+
161
+ def inline_module_name
162
+ node_class_declarations.inline_module_name
163
+ end
164
+ }
165
+ end
166
+
167
+ rule labeled_sequence_primary
168
+ label sequence_primary {
169
+ def compile(lexical_address, builder)
170
+ sequence_primary.compile(lexical_address, builder)
171
+ end
172
+
173
+ def inline_modules
174
+ sequence_primary.inline_modules
175
+ end
176
+
177
+ def label_name
178
+ if label.name
179
+ label.name
180
+ elsif sequence_primary.instance_of?(Nonterminal)
181
+ sequence_primary.text_value
182
+ else
183
+ nil
184
+ end
185
+ end
186
+ }
187
+ end
188
+
189
+ rule label
190
+ (alpha_char alphanumeric_char*) ':' {
191
+ def name
192
+ elements[0].text_value
193
+ end
194
+ }
195
+ /
196
+ '' {
197
+ def name
198
+ nil
199
+ end
200
+ }
201
+ end
202
+
203
+ rule sequence_primary
204
+ prefix atomic {
205
+ def compile(lexical_address, builder)
206
+ prefix.compile(lexical_address, builder, self)
207
+ end
208
+
209
+ def prefixed_expression
210
+ elements[1]
211
+ end
212
+
213
+ def inline_modules
214
+ atomic.inline_modules
215
+ end
216
+
217
+ def inline_module_name
218
+ nil
219
+ end
220
+ }
221
+ /
222
+ atomic suffix {
223
+ def compile(lexical_address, builder)
224
+ suffix.compile(lexical_address, builder, self)
225
+ end
226
+
227
+ def node_class_name
228
+ nil
229
+ end
230
+
231
+ def inline_modules
232
+ atomic.inline_modules
233
+ end
234
+
235
+ def inline_module_name
236
+ nil
237
+ end
238
+ }
239
+ /
240
+ atomic
241
+ end
242
+
243
+ rule suffix
244
+ repetition_suffix / optional_suffix
245
+ end
246
+
247
+ rule optional_suffix
248
+ '?' <Optional>
249
+ end
250
+
251
+ rule node_class_declarations
252
+ node_class_expression trailing_inline_module {
253
+ def node_class_name
254
+ node_class_expression.node_class_name
255
+ end
256
+
257
+ def inline_modules
258
+ trailing_inline_module.inline_modules
259
+ end
260
+
261
+ def inline_module
262
+ trailing_inline_module.inline_module
263
+ end
264
+
265
+ def inline_module_name
266
+ inline_module.module_name if inline_module
267
+ end
268
+ }
269
+ end
270
+
271
+ rule repetition_suffix
272
+ '+' <OneOrMore> / '*' <ZeroOrMore>
273
+ end
274
+
275
+ rule prefix
276
+ '&' <AndPredicate> / '!' <NotPredicate> / '~' <TransientPrefix>
277
+ end
278
+
279
+ rule atomic
280
+ terminal
281
+ /
282
+ nonterminal
283
+ /
284
+ parenthesized_expression
285
+ end
286
+
287
+ rule parenthesized_expression
288
+ '(' space? parsing_expression space? ')' <ParenthesizedExpression> {
289
+ def inline_modules
290
+ parsing_expression.inline_modules
291
+ end
292
+ }
293
+ end
294
+
295
+ rule nonterminal
296
+ !keyword_inside_grammar (alpha_char alphanumeric_char*) <Nonterminal>
297
+ end
298
+
299
+ rule terminal
300
+ quoted_string / character_class / anything_symbol
301
+ end
302
+
303
+ rule quoted_string
304
+ (single_quoted_string / double_quoted_string) {
305
+ def string
306
+ super.text_value
307
+ end
308
+ }
309
+ end
310
+
311
+ rule double_quoted_string
312
+ '"' string:(!'"' ("\\\\" / '\"' / .))* '"' <Terminal>
313
+ end
314
+
315
+ rule single_quoted_string
316
+ "'" string:(!"'" ("\\\\" / "\\'" / .))* "'" <Terminal>
317
+ end
318
+
319
+ rule character_class
320
+ '[' characters:(!']' ('\\' . /!'\\' .))+ ']' <CharacterClass> {
321
+ def characters
322
+ super.text_value
323
+ end
324
+ }
325
+ end
326
+
327
+ rule anything_symbol
328
+ '.' <AnythingSymbol>
329
+ end
330
+
331
+ rule node_class_expression
332
+ space '<' (!'>' .)+ '>' {
333
+ def node_class_name
334
+ elements[2].text_value
335
+ end
336
+ }
337
+ /
338
+ '' {
339
+ def node_class_name
340
+ nil
341
+ end
342
+ }
343
+ end
344
+
345
+ rule trailing_inline_module
346
+ space inline_module {
347
+ def inline_modules
348
+ [inline_module]
349
+ end
350
+
351
+ def inline_module_name
352
+ inline_module.module_name
353
+ end
354
+ }
355
+ /
356
+ '' {
357
+ def inline_modules
358
+ []
359
+ end
360
+
361
+ def inline_module
362
+ nil
363
+ end
364
+
365
+ def inline_module_name
366
+ nil
367
+ end
368
+ }
369
+ end
370
+
371
+ rule inline_module
372
+ '{' (inline_module / ![{}] .)* '}' <InlineModule>
373
+ end
374
+
375
+ rule keyword_inside_grammar
376
+ ('rule' / 'end') !non_space_char
377
+ end
378
+
379
+ rule non_space_char
380
+ !space .
381
+ end
382
+
383
+ rule alpha_char
384
+ [A-Za-z_]
385
+ end
386
+
387
+ rule alphanumeric_char
388
+ alpha_char / [0-9]
389
+ end
390
+
391
+ rule space
392
+ (white / comment_to_eol)+
393
+ end
394
+
395
+ rule comment_to_eol
396
+ '#' (!"\n" .)*
397
+ end
398
+
399
+ rule white
400
+ [ \t\n\r]
401
+ end
402
+ end
403
+ end
404
+ end
@@ -0,0 +1,19 @@
1
+ dir = File.dirname(__FILE__)
2
+ require File.join(dir, *%w[node_classes parsing_expression])
3
+ require File.join(dir, *%w[node_classes atomic_expression])
4
+ require File.join(dir, *%w[node_classes inline_module])
5
+ require File.join(dir, *%w[node_classes treetop_file])
6
+ require File.join(dir, *%w[node_classes grammar])
7
+ require File.join(dir, *%w[node_classes declaration_sequence])
8
+ require File.join(dir, *%w[node_classes parsing_rule])
9
+ require File.join(dir, *%w[node_classes parenthesized_expression])
10
+ require File.join(dir, *%w[node_classes nonterminal])
11
+ require File.join(dir, *%w[node_classes terminal])
12
+ require File.join(dir, *%w[node_classes anything_symbol])
13
+ require File.join(dir, *%w[node_classes character_class])
14
+ require File.join(dir, *%w[node_classes sequence])
15
+ require File.join(dir, *%w[node_classes choice])
16
+ require File.join(dir, *%w[node_classes repetition])
17
+ require File.join(dir, *%w[node_classes optional])
18
+ require File.join(dir, *%w[node_classes predicate])
19
+ require File.join(dir, *%w[node_classes transient_prefix])
@@ -0,0 +1,18 @@
1
+ module Treetop
2
+ module Compiler
3
+ class AnythingSymbol < AtomicExpression
4
+ def compile(address, builder, parent_expression = nil)
5
+ super
6
+ builder.if__ "index < input_length" do
7
+ assign_result "(#{node_class_name}).new(input, index...(index + 1))"
8
+ extend_result_with_inline_module
9
+ builder << "@index += 1"
10
+ end
11
+ builder.else_ do
12
+ builder << 'terminal_parse_failure("any character")'
13
+ assign_result 'nil'
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module Treetop
2
+ module Compiler
3
+ class AtomicExpression < ParsingExpression
4
+ def inline_modules
5
+ []
6
+ end
7
+
8
+ def single_quote(string)
9
+ # Double any backslashes, then backslash any single-quotes:
10
+ "'#{string.gsub(/\\/) { '\\\\' }.gsub(/'/) { "\\'"}}'"
11
+ end
12
+ end
13
+ end
14
+ end