treetop 0.1.0 → 1.0.0

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 (153) hide show
  1. data/README +3 -0
  2. data/Rakefile +35 -0
  3. data/bin/tt +25 -0
  4. data/lib/treetop.rb +10 -6
  5. data/lib/treetop/compiler.rb +7 -0
  6. data/lib/treetop/compiler/grammar_compiler.rb +21 -0
  7. data/lib/treetop/compiler/lexical_address_space.rb +17 -0
  8. data/lib/treetop/compiler/load_grammar.rb +7 -0
  9. data/lib/treetop/compiler/metagrammar.rb +2441 -0
  10. data/lib/treetop/compiler/metagrammar.treetop +384 -0
  11. data/lib/treetop/compiler/node_classes.rb +18 -0
  12. data/lib/treetop/compiler/node_classes/anything_symbol.rb +10 -0
  13. data/lib/treetop/compiler/node_classes/atomic_expression.rb +9 -0
  14. data/lib/treetop/compiler/node_classes/character_class.rb +10 -0
  15. data/lib/treetop/compiler/node_classes/choice.rb +31 -0
  16. data/lib/treetop/compiler/node_classes/declaration_sequence.rb +24 -0
  17. data/lib/treetop/compiler/node_classes/grammar.rb +28 -0
  18. data/lib/treetop/compiler/node_classes/inline_module.rb +27 -0
  19. data/lib/treetop/compiler/node_classes/nonterminal.rb +11 -0
  20. data/lib/treetop/compiler/node_classes/optional.rb +19 -0
  21. data/lib/treetop/compiler/node_classes/parenthesized_expression.rb +9 -0
  22. data/lib/treetop/compiler/node_classes/parsing_expression.rb +132 -0
  23. data/lib/treetop/compiler/node_classes/parsing_rule.rb +55 -0
  24. data/lib/treetop/compiler/node_classes/predicate.rb +45 -0
  25. data/lib/treetop/compiler/node_classes/repetition.rb +56 -0
  26. data/lib/treetop/compiler/node_classes/sequence.rb +64 -0
  27. data/lib/treetop/compiler/node_classes/terminal.rb +10 -0
  28. data/lib/treetop/compiler/node_classes/treetop_file.rb +9 -0
  29. data/lib/treetop/compiler/ruby_builder.rb +109 -0
  30. data/lib/treetop/ruby_extensions.rb +2 -0
  31. data/lib/treetop/ruby_extensions/string.rb +19 -0
  32. data/lib/treetop/runtime.rb +9 -0
  33. data/lib/treetop/runtime/compiled_parser.rb +66 -0
  34. data/lib/treetop/runtime/node_cache.rb +27 -0
  35. data/lib/treetop/runtime/parse_cache.rb +19 -0
  36. data/lib/treetop/runtime/parse_failure.rb +32 -0
  37. data/lib/treetop/runtime/parse_result.rb +30 -0
  38. data/lib/treetop/runtime/syntax_node.rb +53 -0
  39. data/lib/treetop/runtime/terminal_parse_failure.rb +33 -0
  40. data/lib/treetop/runtime/terminal_syntax_node.rb +12 -0
  41. data/test/compilation_target/target.rb +143 -0
  42. data/test/compilation_target/target.treetop +15 -0
  43. data/test/compilation_target/target_test.rb +56 -0
  44. data/test/compiler/and_predicate_test.rb +33 -0
  45. data/test/compiler/anything_symbol_test.rb +24 -0
  46. data/test/compiler/character_class_test.rb +45 -0
  47. data/test/compiler/choice_test.rb +49 -0
  48. data/test/compiler/circular_compilation_test.rb +20 -0
  49. data/test/compiler/failure_propagation_functional_test.rb +20 -0
  50. data/test/compiler/grammar_compiler_test.rb +58 -0
  51. data/test/compiler/grammar_test.rb +33 -0
  52. data/test/compiler/nonterminal_symbol_test.rb +15 -0
  53. data/test/compiler/not_predicate_test.rb +35 -0
  54. data/test/compiler/one_or_more_test.rb +30 -0
  55. data/test/compiler/optional_test.rb +32 -0
  56. data/test/compiler/parsing_rule_test.rb +30 -0
  57. data/test/compiler/sequence_test.rb +68 -0
  58. data/test/compiler/terminal_symbol_test.rb +35 -0
  59. data/test/compiler/test_grammar.treetop +7 -0
  60. data/test/compiler/zero_or_more_test.rb +51 -0
  61. data/test/composition/a.treetop +11 -0
  62. data/test/composition/b.treetop +11 -0
  63. data/test/composition/c.treetop +10 -0
  64. data/test/composition/d.treetop +10 -0
  65. data/test/composition/grammar_composition_test.rb +23 -0
  66. data/test/parser/syntax_node_test.rb +53 -0
  67. data/test/parser/terminal_parse_failure_test.rb +22 -0
  68. data/test/ruby_extensions/string_test.rb +33 -0
  69. data/test/screw/Rakefile +16 -0
  70. data/test/screw/unit.rb +37 -0
  71. data/test/screw/unit/assertion_failed_error.rb +14 -0
  72. data/test/screw/unit/assertions.rb +615 -0
  73. data/test/screw/unit/auto_runner.rb +227 -0
  74. data/test/screw/unit/collector.rb +45 -0
  75. data/test/screw/unit/collector/dir.rb +107 -0
  76. data/test/screw/unit/collector/objectspace.rb +28 -0
  77. data/test/screw/unit/error.rb +48 -0
  78. data/test/screw/unit/failure.rb +45 -0
  79. data/test/screw/unit/sugar.rb +25 -0
  80. data/test/screw/unit/test_case.rb +176 -0
  81. data/test/screw/unit/test_result.rb +73 -0
  82. data/test/screw/unit/test_suite.rb +70 -0
  83. data/test/screw/unit/ui.rb +4 -0
  84. data/test/screw/unit/ui/console/test_runner.rb +118 -0
  85. data/test/screw/unit/ui/fox/test_runner.rb +268 -0
  86. data/test/screw/unit/ui/gtk/test_runner.rb +416 -0
  87. data/test/screw/unit/ui/gtk2/testrunner.rb +465 -0
  88. data/test/screw/unit/ui/test_runner_mediator.rb +58 -0
  89. data/test/screw/unit/ui/test_runner_utilities.rb +46 -0
  90. data/test/screw/unit/ui/tk/test_runner.rb +260 -0
  91. data/test/screw/unit/util.rb +4 -0
  92. data/test/screw/unit/util/backtrace_filter.rb +40 -0
  93. data/test/screw/unit/util/observable.rb +82 -0
  94. data/test/screw/unit/util/proc_wrapper.rb +48 -0
  95. data/test/test_helper.rb +89 -0
  96. metadata +127 -69
  97. data/lib/treetop/api.rb +0 -3
  98. data/lib/treetop/api/load_grammar.rb +0 -16
  99. data/lib/treetop/api/malformed_grammar_exception.rb +0 -9
  100. data/lib/treetop/grammar.rb +0 -7
  101. data/lib/treetop/grammar/grammar.rb +0 -48
  102. data/lib/treetop/grammar/grammar_builder.rb +0 -35
  103. data/lib/treetop/grammar/parsing_expression_builder.rb +0 -5
  104. data/lib/treetop/grammar/parsing_expression_builder_helper.rb +0 -121
  105. data/lib/treetop/grammar/parsing_expressions.rb +0 -18
  106. data/lib/treetop/grammar/parsing_expressions/and_predicate.rb +0 -17
  107. data/lib/treetop/grammar/parsing_expressions/anything_symbol.rb +0 -20
  108. data/lib/treetop/grammar/parsing_expressions/character_class.rb +0 -24
  109. data/lib/treetop/grammar/parsing_expressions/node_instantiating_parsing_expression.rb +0 -14
  110. data/lib/treetop/grammar/parsing_expressions/node_propagating_parsing_expression.rb +0 -4
  111. data/lib/treetop/grammar/parsing_expressions/nonterminal_symbol.rb +0 -42
  112. data/lib/treetop/grammar/parsing_expressions/not_predicate.rb +0 -18
  113. data/lib/treetop/grammar/parsing_expressions/one_or_more.rb +0 -12
  114. data/lib/treetop/grammar/parsing_expressions/optional.rb +0 -14
  115. data/lib/treetop/grammar/parsing_expressions/ordered_choice.rb +0 -27
  116. data/lib/treetop/grammar/parsing_expressions/parsing_expression.rb +0 -36
  117. data/lib/treetop/grammar/parsing_expressions/predicate.rb +0 -25
  118. data/lib/treetop/grammar/parsing_expressions/repeating_parsing_expression.rb +0 -29
  119. data/lib/treetop/grammar/parsing_expressions/sequence.rb +0 -41
  120. data/lib/treetop/grammar/parsing_expressions/terminal_parsing_expression.rb +0 -11
  121. data/lib/treetop/grammar/parsing_expressions/terminal_symbol.rb +0 -31
  122. data/lib/treetop/grammar/parsing_expressions/zero_or_more.rb +0 -11
  123. data/lib/treetop/grammar/parsing_rule.rb +0 -10
  124. data/lib/treetop/metagrammar.rb +0 -2
  125. data/lib/treetop/metagrammar/metagrammar.rb +0 -14
  126. data/lib/treetop/metagrammar/metagrammar.treetop +0 -320
  127. data/lib/treetop/parser.rb +0 -11
  128. data/lib/treetop/parser/node_cache.rb +0 -25
  129. data/lib/treetop/parser/parse_cache.rb +0 -17
  130. data/lib/treetop/parser/parse_failure.rb +0 -22
  131. data/lib/treetop/parser/parse_result.rb +0 -26
  132. data/lib/treetop/parser/parser.rb +0 -24
  133. data/lib/treetop/parser/sequence_syntax_node.rb +0 -14
  134. data/lib/treetop/parser/syntax_node.rb +0 -31
  135. data/lib/treetop/parser/terminal_parse_failure.rb +0 -18
  136. data/lib/treetop/parser/terminal_syntax_node.rb +0 -7
  137. data/lib/treetop/protometagrammar.rb +0 -16
  138. data/lib/treetop/protometagrammar/anything_symbol_expression_builder.rb +0 -13
  139. data/lib/treetop/protometagrammar/block_expression_builder.rb +0 -17
  140. data/lib/treetop/protometagrammar/character_class_expression_builder.rb +0 -25
  141. data/lib/treetop/protometagrammar/grammar_expression_builder.rb +0 -38
  142. data/lib/treetop/protometagrammar/nonterminal_symbol_expression_builder.rb +0 -45
  143. data/lib/treetop/protometagrammar/ordered_choice_expression_builder.rb +0 -21
  144. data/lib/treetop/protometagrammar/parsing_rule_expression_builder.rb +0 -23
  145. data/lib/treetop/protometagrammar/parsing_rule_sequence_expression_builder.rb +0 -14
  146. data/lib/treetop/protometagrammar/prefix_expression_builder.rb +0 -25
  147. data/lib/treetop/protometagrammar/primary_expression_builder.rb +0 -71
  148. data/lib/treetop/protometagrammar/protometagrammar.rb +0 -25
  149. data/lib/treetop/protometagrammar/sequence_expression_builder.rb +0 -37
  150. data/lib/treetop/protometagrammar/suffix_expression_builder.rb +0 -33
  151. data/lib/treetop/protometagrammar/terminal_symbol_expression_builder.rb +0 -52
  152. data/lib/treetop/protometagrammar/trailing_block_expression_builder.rb +0 -30
  153. data/lib/treetop/ruby_extension.rb +0 -11
@@ -1,29 +0,0 @@
1
- module Treetop
2
- class RepeatingParsingExpression < Sequence
3
- attr_reader :repeated_expression
4
-
5
- def initialize(repeated_expression)
6
- super
7
- @repeated_expression = repeated_expression
8
- end
9
-
10
- def parse_at(input, start_index, parser)
11
- results = []
12
- next_index = start_index
13
-
14
- while true
15
- result = repeated_expression.parse_at(input, next_index, parser)
16
- break if result.failure?
17
- results << result
18
- next_index = result.interval.end
19
- end
20
-
21
- if enough? results
22
- interval = start_index...next_index
23
- return success(input, interval, results, results + [result])
24
- else
25
- return failure_at(start_index, results + [result])
26
- end
27
- end
28
- end
29
- end
@@ -1,41 +0,0 @@
1
- module Treetop
2
- class Sequence < NodeInstantiatingParsingExpression
3
- attr_reader :elements, :node_class
4
-
5
- def initialize(elements)
6
- super()
7
- @elements = elements
8
- end
9
-
10
- def node_superclass
11
- SequenceSyntaxNode
12
- end
13
-
14
- def to_s
15
- parenthesize((@elements.collect {|elt| elt.to_s}).join(" "))
16
- end
17
-
18
- def parse_at(input, start_index, parser)
19
- results = []
20
- next_index = start_index
21
-
22
- for elt in elements
23
- result = elt.parse_at(input, next_index, parser)
24
- results << result
25
- return failure_at(start_index, results) if result.failure?
26
- next_index = result.interval.end
27
- end
28
-
29
- success(input, start_index...next_index, results, results)
30
- end
31
-
32
- protected
33
-
34
- def success(input, interval, results, encountered_child_results)
35
- return node_class.new(input,
36
- interval,
37
- results,
38
- collect_nested_failures(encountered_child_results))
39
- end
40
- end
41
- end
@@ -1,11 +0,0 @@
1
- module Treetop
2
- class TerminalParsingExpression < NodeInstantiatingParsingExpression
3
- def initialize
4
- super
5
- end
6
-
7
- def node_superclass
8
- TerminalSyntaxNode
9
- end
10
- end
11
- end
@@ -1,31 +0,0 @@
1
- module Treetop
2
- class TerminalSymbol < TerminalParsingExpression
3
- attr_accessor :prefix
4
-
5
- def self.epsilon
6
- @epsilon ||= self.new("")
7
- end
8
-
9
- def initialize(prefix)
10
- super()
11
- self.prefix = prefix
12
- end
13
-
14
- def epsilon?
15
- prefix.blank?
16
- end
17
-
18
- def to_s
19
- "\"#{prefix}\""
20
- end
21
-
22
- def parse_at(input, start_index, parser)
23
-
24
- if input.index(prefix, start_index) == start_index
25
- return node_class.new(input, start_index...(prefix.length + start_index))
26
- else
27
- TerminalParseFailure.new(start_index, self)
28
- end
29
- end
30
- end
31
- end
@@ -1,11 +0,0 @@
1
- module Treetop
2
- class ZeroOrMore < RepeatingParsingExpression
3
- def enough?(results)
4
- true
5
- end
6
-
7
- def to_s
8
- "(#{repeated_expression.to_s})*"
9
- end
10
- end
11
- end
@@ -1,10 +0,0 @@
1
- module Treetop
2
- class ParsingRule
3
- attr_reader :nonterminal_symbol, :parsing_expression
4
-
5
- def initialize(nonterminal_symbol, parsing_expression)
6
- @nonterminal_symbol = nonterminal_symbol
7
- @parsing_expression = parsing_expression
8
- end
9
- end
10
- end
@@ -1,2 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/metagrammar/metagrammar"
@@ -1,14 +0,0 @@
1
- module Treetop
2
- metagrammar_parser = Protometagrammar.new.new_parser
3
-
4
- File.open(File.expand_path('metagrammar.treetop', File.dirname(__FILE__)), 'r') do |file|
5
- metagrammar_text = file.read
6
- result = metagrammar_parser.parse(metagrammar_text)
7
-
8
- unless result.success?
9
- raise 'unable to parse metagrammar'
10
- end
11
-
12
- Metagrammar = result.value
13
- end
14
- end
@@ -1,320 +0,0 @@
1
- grammar Metagrammar
2
- rule grammar
3
- ('grammar' space grammar_name? parsing_rule_sequence space? 'end') {
4
- def value
5
- grammar = Grammar.new(grammar_name)
6
- parsing_rules(grammar).each do |parsing_rule|
7
- grammar.add_parsing_rule(parsing_rule)
8
- end
9
- return grammar
10
- end
11
-
12
- def grammar_name
13
- if elements[2].epsilon?
14
- nil
15
- else
16
- elements[2].value
17
- end
18
- end
19
-
20
- def parsing_rules(grammar)
21
- elements[3].value(grammar)
22
- end
23
- }
24
- end
25
-
26
- rule grammar_name
27
- ([A-Z] alphanumeric_char*) space {
28
- def value
29
- elements[0].text_value.to_sym
30
- end
31
- }
32
- end
33
-
34
- rule parsing_rule_sequence
35
- (parsing_rule (space parsing_rule)*) {
36
- def value(grammar)
37
- [head.value(grammar)] + tail_values(grammar)
38
- end
39
-
40
- def head
41
- elements[0]
42
- end
43
-
44
- def tail_elements
45
- elements[1].elements
46
- end
47
-
48
- def tail_values(grammar)
49
- tail_elements.collect {|tail_element| tail_element.elements[1].value(grammar)}
50
- end
51
- }
52
- /
53
- '' {
54
- def value(grammar)
55
- []
56
- end
57
- }
58
- end
59
-
60
- rule parsing_rule
61
- ('rule' space nonterminal_symbol space ordered_choice space 'end') {
62
- def value(grammar)
63
- ParsingRule.new(nonterminal_symbol.value(grammar),
64
- parsing_expression.value(grammar))
65
- end
66
-
67
- def nonterminal_symbol
68
- elements[2]
69
- end
70
-
71
- def parsing_expression
72
- elements[4]
73
- end
74
- }
75
- end
76
-
77
- rule ordered_choice
78
- (sequence (space? '/' space? sequence)+) {
79
- def value(grammar)
80
- OrderedChoice.new(alternatives(grammar))
81
- end
82
-
83
- def alternatives(grammar)
84
- [head.value(grammar)] + tail_values(grammar)
85
- end
86
-
87
- def head
88
- elements[0]
89
- end
90
-
91
- def tail_elements
92
- elements[1].elements
93
- end
94
-
95
- def tail_values(grammar)
96
- tail_elements.map {|tail_element| tail_element.elements[3].value(grammar)}
97
- end
98
- }
99
- /
100
- sequence
101
- end
102
-
103
- rule sequence
104
- (primary (space primary)+ trailing_block) {
105
- def value(grammar)
106
- trailing_block.value(Sequence.new(sequence_elements(grammar)))
107
- end
108
-
109
- def trailing_block
110
- elements[2]
111
- end
112
-
113
- def sequence_elements(grammar)
114
- [head.value(grammar)] + tail_values(grammar)
115
- end
116
-
117
- def head
118
- elements[0]
119
- end
120
-
121
- def tail_elements
122
- elements[1].elements
123
- end
124
-
125
- def tail_values(grammar)
126
- tail_elements.map {|tail_element| tail_element.elements[1].value(grammar)}
127
- end
128
- }
129
- /
130
- primary
131
- end
132
-
133
- rule parenthesized_ordered_choice
134
- '(' space? ordered_choice space? ')' trailing_block {
135
- def value(grammar)
136
- nested_value = nested_expression.value(grammar)
137
- unless trailing_block.epsilon? || nested_value.kind_of?(NodeInstantiatingParsingExpression)
138
- raise "Blocks can only follow node-instantiating parsing expressions such as sequences and terminal symbols."
139
- end
140
- return trailing_block.value(nested_expression.value(grammar))
141
- end
142
-
143
- def nested_expression
144
- elements[2]
145
- end
146
-
147
- def trailing_block
148
- elements[5]
149
- end
150
- }
151
- end
152
-
153
- rule primary
154
- (prefix? ((parenthesized_ordered_choice / terminal_symbol / nonterminal_symbol) suffix?)) {
155
- def value(grammar)
156
- value = primary_expression.value(grammar)
157
- value = suffix.value(value) unless suffix.epsilon?
158
- value = prefix.value(value) unless prefix.epsilon?
159
- value
160
- end
161
-
162
- def prefix
163
- elements[0]
164
- end
165
-
166
- def primary_expression
167
- elements[1].elements[0]
168
- end
169
-
170
- def suffix
171
- elements[1].elements[1]
172
- end
173
- }
174
- end
175
-
176
- rule prefix
177
- '&' {
178
- def value(parsing_expression)
179
- parsing_expression.and_predicate
180
- end
181
- }
182
- /
183
- '!' {
184
- def value(parsing_expression)
185
- parsing_expression.not_predicate
186
- end
187
- }
188
- end
189
-
190
- rule suffix
191
- '*' {
192
- def value(parsing_expression)
193
- parsing_expression.zero_or_more
194
- end
195
- }
196
- /
197
- '+' {
198
- def value(parsing_expression)
199
- parsing_expression.one_or_more
200
- end
201
- }
202
- /
203
- '?' {
204
- def value(parsing_expression)
205
- parsing_expression.optional
206
- end
207
- }
208
- end
209
-
210
- rule nonterminal_symbol
211
- (!(keyword !alphanumeric_char) (alpha_char alphanumeric_char*)) {
212
- def value(grammar)
213
- grammar.nonterminal_symbol(name)
214
- end
215
-
216
- def name
217
- elements[1].text_value.to_sym
218
- end
219
- }
220
- end
221
-
222
- rule alpha_char
223
- [A-Za-z_]
224
- end
225
-
226
- rule alphanumeric_char
227
- alpha_char / [0-9]
228
- end
229
-
230
- rule terminal_symbol
231
- terminal_symbol_prefix trailing_block {
232
- def value(grammar = nil)
233
- trailing_block.value(terminal_symbol.value)
234
- end
235
-
236
- def terminal_symbol
237
- elements[0]
238
- end
239
-
240
- def trailing_block
241
- elements[1]
242
- end
243
- }
244
- end
245
-
246
- rule terminal_symbol_prefix
247
- single_quoted_string / double_quoted_string / character_class / anything_symbol
248
- end
249
-
250
- rule double_quoted_string
251
- ('"' (!'"' ('\"' / .))* '"') {
252
- def value
253
- TerminalSymbol.new(elements[1].text_value)
254
- end
255
- }
256
- end
257
-
258
- rule single_quoted_string
259
- ("'" (!"'" ("\'" / .))* "'") {
260
- def value
261
- TerminalSymbol.new(elements[1].text_value)
262
- end
263
- }
264
- end
265
-
266
- rule trailing_block
267
- space block {
268
- def value(parsing_expression)
269
- parsing_expression.node_class_eval(block.value)
270
- return parsing_expression
271
- end
272
-
273
- def block
274
- elements[1]
275
- end
276
- }
277
- /
278
- '' {
279
- def value(parsing_expression)
280
- parsing_expression
281
- end
282
- }
283
- end
284
-
285
- rule block
286
- ('{' (block / ![{}] .)* '}') {
287
- def value
288
- elements[1].text_value
289
- end
290
- }
291
- end
292
-
293
- rule character_class
294
- ('[' (!']' ('\]'/.))+ ']') {
295
- def value(grammar = nil)
296
- CharacterClass.new(characters)
297
- end
298
-
299
- def characters
300
- elements[1].text_value
301
- end
302
- }
303
- end
304
-
305
- rule keyword
306
- 'rule' / 'end'
307
- end
308
-
309
- rule anything_symbol
310
- '.' {
311
- def value(grammar = nil)
312
- AnythingSymbol.new
313
- end
314
- }
315
- end
316
-
317
- rule space
318
- [ \t\n\r]+
319
- end
320
- end