treetop 1.2.4 → 1.2.5

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.
data/Rakefile CHANGED
@@ -13,23 +13,8 @@ Spec::Rake::SpecTask.new do |t|
13
13
  t.pattern = 'spec/**/*spec.rb'
14
14
  end
15
15
 
16
- gemspec = Gem::Specification.new do |s|
17
- s.name = "treetop"
18
- s.version = "1.2.4"
19
- s.author = "Nathan Sobo"
20
- s.email = "nathansobo@gmail.com"
21
- s.homepage = "http://functionalform.blogspot.com"
22
- s.platform = Gem::Platform::RUBY
23
- s.summary = "A Ruby-based text parsing and interpretation DSL"
24
- s.files = FileList["README", "Rakefile", "{test,lib,bin,doc,examples}/**/*"].to_a
25
- s.bindir = "bin"
26
- s.executables = ["tt"]
27
- s.require_path = "lib"
28
- s.autorequire = "treetop"
29
- s.has_rdoc = false
30
- s.add_dependency "polyglot"
31
- end
16
+ load "./treetop.gemspec"
32
17
 
33
- Rake::GemPackageTask.new(gemspec) do |pkg|
18
+ Rake::GemPackageTask.new($gemspec) do |pkg|
34
19
  pkg.need_tar = true
35
20
  end
data/bin/tt CHANGED
@@ -12,14 +12,17 @@ end
12
12
 
13
13
  compiler = Treetop::Compiler::GrammarCompiler.new
14
14
 
15
- # explicit output file name option
16
- if ARGV.size == 3 && ARGV[1] == '-o'
17
- compiler.compile(ARGV[0], ARGV[2])
18
- exit
19
- end
20
-
21
- # list of input files option
22
- treetop_files = ARGV
23
- treetop_files.each do |treetop_file_path|
24
- compiler.compile(treetop_file_path)
15
+ while !ARGV.empty?
16
+ treetop_file = ARGV.shift
17
+ if !File.exist?(treetop_file)
18
+ puts "Error: file '#{treetop_file}' doesn't exist\n\n"
19
+ exit(2)
20
+ end
21
+ if ARGV.size >= 2 && ARGV[1] == '-o'
22
+ ARGV.shift # explicit output file name option
23
+ compiler.compile(treetop_file, ARGV.shift)
24
+ else
25
+ # list of input files option
26
+ compiler.compile(treetop_file)
27
+ end
25
28
  end
@@ -232,6 +232,12 @@ module Treetop
232
232
  def space
233
233
  elements[1]
234
234
  end
235
+ end
236
+
237
+ module Grammar1
238
+ def space
239
+ elements[1]
240
+ end
235
241
 
236
242
  def grammar_name
237
243
  elements[2]
@@ -242,7 +248,7 @@ module Treetop
242
248
  end
243
249
 
244
250
  def declaration_sequence
245
- elements[4]
251
+ elements[5]
246
252
  end
247
253
 
248
254
  end
@@ -274,25 +280,53 @@ module Treetop
274
280
  r4 = _nt_space
275
281
  s0 << r4
276
282
  if r4
277
- r5 = _nt_declaration_sequence
283
+ i6, s6 = index, []
284
+ if input.index('do', index) == index
285
+ r7 = (SyntaxNode).new(input, index...(index + 2))
286
+ @index += 2
287
+ else
288
+ terminal_parse_failure('do')
289
+ r7 = nil
290
+ end
291
+ s6 << r7
292
+ if r7
293
+ r8 = _nt_space
294
+ s6 << r8
295
+ end
296
+ if s6.last
297
+ r6 = (SyntaxNode).new(input, i6...index, s6)
298
+ r6.extend(Grammar0)
299
+ else
300
+ self.index = i6
301
+ r6 = nil
302
+ end
303
+ if r6
304
+ r5 = r6
305
+ else
306
+ r5 = SyntaxNode.new(input, index...index)
307
+ end
278
308
  s0 << r5
279
309
  if r5
280
- r7 = _nt_space
281
- if r7
282
- r6 = r7
283
- else
284
- r6 = SyntaxNode.new(input, index...index)
285
- end
286
- s0 << r6
287
- if r6
288
- if input.index('end', index) == index
289
- r8 = (SyntaxNode).new(input, index...(index + 3))
290
- @index += 3
310
+ r9 = _nt_declaration_sequence
311
+ s0 << r9
312
+ if r9
313
+ r11 = _nt_space
314
+ if r11
315
+ r10 = r11
291
316
  else
292
- terminal_parse_failure('end')
293
- r8 = nil
317
+ r10 = SyntaxNode.new(input, index...index)
318
+ end
319
+ s0 << r10
320
+ if r10
321
+ if input.index('end', index) == index
322
+ r12 = (SyntaxNode).new(input, index...(index + 3))
323
+ @index += 3
324
+ else
325
+ terminal_parse_failure('end')
326
+ r12 = nil
327
+ end
328
+ s0 << r12
294
329
  end
295
- s0 << r8
296
330
  end
297
331
  end
298
332
  end
@@ -301,7 +335,7 @@ module Treetop
301
335
  end
302
336
  if s0.last
303
337
  r0 = (Grammar).new(input, i0...index, s0)
304
- r0.extend(Grammar0)
338
+ r0.extend(Grammar1)
305
339
  else
306
340
  self.index = i0
307
341
  r0 = nil
@@ -581,6 +615,12 @@ module Treetop
581
615
  def space
582
616
  elements[1]
583
617
  end
618
+ end
619
+
620
+ module ParsingRule1
621
+ def space
622
+ elements[1]
623
+ end
584
624
 
585
625
  def nonterminal
586
626
  elements[2]
@@ -591,11 +631,11 @@ module Treetop
591
631
  end
592
632
 
593
633
  def parsing_expression
594
- elements[4]
634
+ elements[5]
595
635
  end
596
636
 
597
637
  def space
598
- elements[5]
638
+ elements[6]
599
639
  end
600
640
 
601
641
  end
@@ -627,20 +667,48 @@ module Treetop
627
667
  r4 = _nt_space
628
668
  s0 << r4
629
669
  if r4
630
- r5 = _nt_parsing_expression
670
+ i6, s6 = index, []
671
+ if input.index('do', index) == index
672
+ r7 = (SyntaxNode).new(input, index...(index + 2))
673
+ @index += 2
674
+ else
675
+ terminal_parse_failure('do')
676
+ r7 = nil
677
+ end
678
+ s6 << r7
679
+ if r7
680
+ r8 = _nt_space
681
+ s6 << r8
682
+ end
683
+ if s6.last
684
+ r6 = (SyntaxNode).new(input, i6...index, s6)
685
+ r6.extend(ParsingRule0)
686
+ else
687
+ self.index = i6
688
+ r6 = nil
689
+ end
690
+ if r6
691
+ r5 = r6
692
+ else
693
+ r5 = SyntaxNode.new(input, index...index)
694
+ end
631
695
  s0 << r5
632
696
  if r5
633
- r6 = _nt_space
634
- s0 << r6
635
- if r6
636
- if input.index('end', index) == index
637
- r7 = (SyntaxNode).new(input, index...(index + 3))
638
- @index += 3
639
- else
640
- terminal_parse_failure('end')
641
- r7 = nil
697
+ r9 = _nt_parsing_expression
698
+ s0 << r9
699
+ if r9
700
+ r10 = _nt_space
701
+ s0 << r10
702
+ if r10
703
+ if input.index('end', index) == index
704
+ r11 = (SyntaxNode).new(input, index...(index + 3))
705
+ @index += 3
706
+ else
707
+ terminal_parse_failure('end')
708
+ r11 = nil
709
+ end
710
+ s0 << r11
642
711
  end
643
- s0 << r7
644
712
  end
645
713
  end
646
714
  end
@@ -649,7 +717,7 @@ module Treetop
649
717
  end
650
718
  if s0.last
651
719
  r0 = (ParsingRule).new(input, i0...index, s0)
652
- r0.extend(ParsingRule0)
720
+ r0.extend(ParsingRule1)
653
721
  else
654
722
  self.index = i0
655
723
  r0 = nil
@@ -18,7 +18,7 @@ module Treetop
18
18
  end
19
19
 
20
20
  rule grammar
21
- 'grammar' space grammar_name space declaration_sequence space? 'end' <Grammar>
21
+ 'grammar' space grammar_name space ('do' space)? declaration_sequence space? 'end' <Grammar>
22
22
  end
23
23
 
24
24
  rule grammar_name
@@ -55,7 +55,7 @@ module Treetop
55
55
  end
56
56
 
57
57
  rule parsing_rule
58
- 'rule' space nonterminal space parsing_expression space 'end' <ParsingRule>
58
+ 'rule' space nonterminal space ('do' space)? parsing_expression space 'end' <ParsingRule>
59
59
  end
60
60
 
61
61
  rule parsing_expression
@@ -4,7 +4,7 @@ module Treetop
4
4
  def compile(address, builder, parent_expression = nil)
5
5
  super
6
6
  builder.if__ "index < input_length" do
7
- assign_result "(#{node_class_name}).new(input, index...(index + 1))"
7
+ assign_result "instantiate_node(#{node_class_name},input, index...(index + 1))"
8
8
  extend_result_with_inline_module
9
9
  builder << "@index += 1"
10
10
  end
@@ -5,7 +5,7 @@ module Treetop
5
5
  super
6
6
 
7
7
  builder.if__ "input.index(Regexp.new(#{single_quote(text_value)}), index) == index" do
8
- assign_result "(#{node_class_name}).new(input, index...(index + 1))"
8
+ assign_result "instantiate_node(#{node_class_name},input, index...(index + 1))"
9
9
  extend_result_with_inline_module
10
10
  builder << "@index += 1"
11
11
  end
@@ -3,7 +3,7 @@ module Treetop
3
3
  module InlineModuleMixin
4
4
  attr_reader :module_name
5
5
 
6
- def compile(index, rule, builder)
6
+ def compile(index, builder, rule)
7
7
  @module_name = "#{rule.name.treetop_camelize}#{index}"
8
8
  end
9
9
  end
@@ -12,7 +12,7 @@ module Treetop
12
12
 
13
13
  include InlineModuleMixin
14
14
 
15
- def compile(index, rule, builder)
15
+ def compile(index, builder, rule)
16
16
  super
17
17
  builder.module_declaration(module_name) do
18
18
  builder << ruby_code.gsub(/\A\n/, '').rstrip
@@ -24,4 +24,4 @@ module Treetop
24
24
  end
25
25
  end
26
26
  end
27
- end
27
+ end
@@ -83,7 +83,7 @@ module Treetop
83
83
  end
84
84
 
85
85
  def epsilon_node
86
- "SyntaxNode.new(input, index...index)"
86
+ "instantiate_node(SyntaxNode,input, index...index)"
87
87
  end
88
88
 
89
89
  def assign_failure(start_index_var)
@@ -9,7 +9,7 @@ module Treetop
9
9
 
10
10
  def compile_inline_module_declarations(builder)
11
11
  parsing_expression.inline_modules.each_with_index do |inline_module, i|
12
- inline_module.compile(i, self, builder)
12
+ inline_module.compile(i, builder, self)
13
13
  builder.newline
14
14
  end
15
15
  end
@@ -52,4 +52,4 @@ module Treetop
52
52
  end
53
53
  end
54
54
  end
55
- end
55
+ end
@@ -24,7 +24,7 @@ module Treetop
24
24
  end
25
25
 
26
26
  def assign_and_extend_result
27
- assign_result "#{node_class_name}.new(input, #{start_index_var}...index, #{accumulator_var})"
27
+ assign_result "instantiate_node(#{node_class_name},input, #{start_index_var}...index, #{accumulator_var})"
28
28
  extend_result_with_inline_module
29
29
  end
30
30
  end
@@ -7,7 +7,7 @@ module Treetop
7
7
  use_vars :result, :start_index, :accumulator
8
8
  compile_sequence_elements(sequence_elements)
9
9
  builder.if__ "#{accumulator_var}.last" do
10
- assign_result "(#{node_class_name}).new(input, #{start_index_var}...index, #{accumulator_var})"
10
+ assign_result "instantiate_node(#{node_class_name},input, #{start_index_var}...index, #{accumulator_var})"
11
11
  extend_result sequence_element_accessor_module_name if sequence_element_accessor_module_name
12
12
  extend_result_with_inline_module
13
13
  end
@@ -50,7 +50,7 @@ module Treetop
50
50
  @sequence_elements = sequence_elements
51
51
  end
52
52
 
53
- def compile(index, rule, builder)
53
+ def compile(index, builder, rule)
54
54
  super
55
55
  builder.module_declaration(module_name) do
56
56
  sequence_elements.each_with_index do |element, index|
@@ -6,7 +6,7 @@ module Treetop
6
6
  string_length = eval(text_value).length
7
7
 
8
8
  builder.if__ "input.index(#{text_value}, index) == index" do
9
- assign_result "(#{node_class_name}).new(input, index...(index + #{string_length}))"
9
+ assign_result "instantiate_node(#{node_class_name},input, index...(index + #{string_length}))"
10
10
  extend_result_with_inline_module
11
11
  builder << "@index += #{string_length}"
12
12
  end
@@ -64,7 +64,7 @@ module Treetop
64
64
 
65
65
  def parse_anything(node_class = SyntaxNode, inline_module = nil)
66
66
  if index < input.length
67
- result = node_class.new(input, index...(index + 1))
67
+ result = instantiate_node(node_class,input, index...(index + 1))
68
68
  result.extend(inline_module) if inline_module
69
69
  @index += 1
70
70
  result
@@ -73,6 +73,14 @@ module Treetop
73
73
  end
74
74
  end
75
75
 
76
+ def instantiate_node(node_type,*args)
77
+ if node_type.respond_to? :new
78
+ node_type.new(*args)
79
+ else
80
+ SyntaxNode.new(*args).extend(node_type)
81
+ end
82
+ end
83
+
76
84
  def terminal_parse_failure(expected_string)
77
85
  return nil if index < max_terminal_failure_index
78
86
  if index > max_terminal_failure_index
@@ -27,7 +27,7 @@ module Treetop
27
27
  end
28
28
 
29
29
  def empty?
30
- interval.first == interval.last && interval.exclude_end?
30
+ interval.first == interval.last && interval.exclude_end?
31
31
  end
32
32
 
33
33
  def extension_modules
@@ -69,4 +69,4 @@ module Treetop
69
69
  end
70
70
  end
71
71
  end
72
- end
72
+ end
@@ -0,0 +1,21 @@
1
+ module Treetop
2
+ module Runtime
3
+ class TerminalParseFailure
4
+ attr_reader :index
5
+
6
+ def initialize(index, expected_string)
7
+ @index = index
8
+ @caller = caller
9
+ @expected_string = expected_string
10
+ end
11
+
12
+ def expected_string
13
+ "#{@expected_string} from #{@caller.map{|s| s.sub(/\A.*:([0-9]+):in `([^']*)'.*/,'\2:\1')}*" from "}\n\t"
14
+ end
15
+
16
+ def to_s
17
+ "String matching #{expected_string} expected."
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ module Treetop #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 1
4
+ MINOR = 2
5
+ TINY = 5
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: treetop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Sobo
@@ -9,11 +9,12 @@ autorequire: treetop
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-02 00:00:00 +10:00
12
+ date: 2009-03-19 00:00:00 +11:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: polyglot
17
+ type: :runtime
17
18
  version_requirement:
18
19
  version_requirements: !ruby/object:Gem::Requirement
19
20
  requirements:
@@ -32,7 +33,6 @@ extra_rdoc_files: []
32
33
  files:
33
34
  - README
34
35
  - Rakefile
35
- - lib/metagrammar.rb
36
36
  - lib/treetop
37
37
  - lib/treetop/bootstrap_gen_1_metagrammar.rb
38
38
  - lib/treetop/compiler
@@ -74,8 +74,10 @@ files:
74
74
  - lib/treetop/runtime/interval_skip_list.rb
75
75
  - lib/treetop/runtime/syntax_node.rb
76
76
  - lib/treetop/runtime/terminal_parse_failure.rb
77
+ - lib/treetop/runtime/terminal_parse_failure_debug.rb
77
78
  - lib/treetop/runtime/terminal_syntax_node.rb
78
79
  - lib/treetop/runtime.rb
80
+ - lib/treetop/version.rb
79
81
  - lib/treetop.rb
80
82
  - bin/tt
81
83
  - doc/contributing_and_planned_features.markdown
@@ -120,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
122
  requirements: []
121
123
 
122
124
  rubyforge_project:
123
- rubygems_version: 1.1.0
125
+ rubygems_version: 1.3.1
124
126
  signing_key:
125
127
  specification_version: 2
126
128
  summary: A Ruby-based text parsing and interpretation DSL
data/lib/metagrammar.rb DELETED
File without changes