delorean_lang 0.5.1 → 0.5.2

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 (41) hide show
  1. checksums.yaml +5 -5
  2. data/.gitlab-ci.yml +1 -2
  3. data/.rubocop.yml +45 -5
  4. data/.rubocop_todo.yml +1 -634
  5. data/Gemfile +3 -1
  6. data/README.md +22 -0
  7. data/Rakefile +3 -1
  8. data/delorean.gemspec +18 -17
  9. data/lib/delorean/abstract_container.rb +4 -2
  10. data/lib/delorean/base.rb +30 -27
  11. data/lib/delorean/cache.rb +2 -0
  12. data/lib/delorean/cache/adapters.rb +2 -0
  13. data/lib/delorean/cache/adapters/base.rb +2 -0
  14. data/lib/delorean/cache/adapters/ruby_cache.rb +5 -0
  15. data/lib/delorean/const.rb +5 -3
  16. data/lib/delorean/debug.rb +6 -5
  17. data/lib/delorean/delorean.rb +466 -147
  18. data/lib/delorean/delorean.treetop +13 -1
  19. data/lib/delorean/engine.rb +61 -50
  20. data/lib/delorean/error.rb +2 -1
  21. data/lib/delorean/model.rb +12 -9
  22. data/lib/delorean/nodes.rb +130 -67
  23. data/lib/delorean/ruby.rb +2 -0
  24. data/lib/delorean/ruby/whitelists.rb +2 -0
  25. data/lib/delorean/ruby/whitelists/base.rb +7 -3
  26. data/lib/delorean/ruby/whitelists/default.rb +6 -6
  27. data/lib/delorean/ruby/whitelists/empty.rb +3 -2
  28. data/lib/delorean/ruby/whitelists/matchers.rb +2 -0
  29. data/lib/delorean/ruby/whitelists/matchers/arguments.rb +2 -0
  30. data/lib/delorean/ruby/whitelists/matchers/method.rb +5 -2
  31. data/lib/delorean/ruby/whitelists/whitelist_error.rb +2 -0
  32. data/lib/delorean/version.rb +3 -1
  33. data/lib/delorean_lang.rb +3 -1
  34. data/spec/cache_spec.rb +4 -2
  35. data/spec/dev_spec.rb +68 -69
  36. data/spec/eval_spec.rb +824 -729
  37. data/spec/func_spec.rb +172 -176
  38. data/spec/parse_spec.rb +516 -522
  39. data/spec/ruby/whitelist_spec.rb +6 -3
  40. data/spec/spec_helper.rb +26 -23
  41. metadata +27 -27
data/Gemfile CHANGED
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in delorean.gemspec
4
6
  gemspec
5
7
 
6
8
  group :development, :test do
7
- gem 'rspec-instafail', require: false
8
9
  gem 'pry'
10
+ gem 'rspec-instafail', require: false
9
11
  end
data/README.md CHANGED
@@ -121,6 +121,28 @@ newly defined `teen_min`. Therefore, `IndiaInfo.is_teenager` with
121
121
  input of `age = 10` will evaluate to `true`. Whereas,
122
122
  `USInfo.is_teenager` with input of `age = 10` will evaluate to `false`.
123
123
 
124
+ ### Debugging
125
+
126
+ You can use `(ERR())` to add a breakpoint:
127
+
128
+ ```
129
+ USInfo:
130
+ age = ?
131
+ teen_max = 19
132
+ teen_min = 13
133
+ is_teenager = (ERR()) && age >= teen_min && age <= teen_max
134
+
135
+ ```
136
+
137
+ Then you can call attributes by using their mangled name (e.g. attr__D) and passing the context. attr__D(_e). Of course, you can use `ls` to list available methods.
138
+
139
+ ```
140
+ teen_max__D(_e) # 19
141
+ age__D(_e)
142
+ ```
143
+
144
+ ### TODO
145
+
124
146
  TODO: provide details on the following topics:
125
147
 
126
148
  * Supported data types
data/Rakefile CHANGED
@@ -1,2 +1,4 @@
1
1
  #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/gem_tasks'
@@ -1,25 +1,26 @@
1
- require File.expand_path('../lib/delorean/version', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('lib/delorean/version', __dir__)
2
4
 
3
5
  Gem::Specification.new do |gem|
4
- gem.authors = ["Arman Bostani"]
5
- gem.email = ["arman.bostani@pnmac.com"]
6
- gem.description = %q{A "compiler" for the Delorean programming language}
7
- gem.summary = %q{Delorean compiler}
8
- gem.homepage = "https://github.com/arman000/delorean_lang"
6
+ gem.authors = ['Arman Bostani']
7
+ gem.email = ['arman.bostani@pnmac.com']
8
+ gem.description = 'A "compiler" for the Delorean programming language'
9
+ gem.summary = 'Delorean compiler'
10
+ gem.homepage = 'https://github.com/arman000/delorean_lang'
9
11
 
10
- gem.files = `git ls-files`.split($\)
11
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
13
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
12
14
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
- gem.name = "delorean_lang"
14
- gem.require_paths = ["lib"]
15
+ gem.name = 'delorean_lang'
16
+ gem.require_paths = ['lib']
15
17
  gem.version = Delorean::VERSION
16
18
  gem.licenses = ['MIT']
17
19
 
18
-
19
- gem.add_dependency "treetop", "~> 1.5"
20
- gem.add_dependency "activerecord", ">= 3.2"
21
- gem.add_development_dependency "rspec", '~> 2.1'
22
- gem.add_development_dependency "sqlite3", '~> 1.3.10'
23
- gem.add_development_dependency "pry"
24
- gem.add_development_dependency "rubocop"
20
+ gem.add_dependency 'activerecord', '>= 3.2'
21
+ gem.add_dependency 'treetop', '~> 1.5'
22
+ gem.add_development_dependency 'pry'
23
+ gem.add_development_dependency 'rspec', '~> 2.1'
24
+ gem.add_development_dependency 'rubocop'
25
+ gem.add_development_dependency 'sqlite3', '~> 1.3.10'
25
26
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'delorean/base'
2
4
 
3
5
  module Delorean
4
6
  class AbstractContainer
5
- def get_engine(name)
6
- raise "get_engine needs to be overriden"
7
+ def get_engine(_name)
8
+ raise 'get_engine needs to be overriden'
7
9
  end
8
10
  end
9
11
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/time'
2
4
  require 'active_record'
3
5
  require 'bigdecimal'
@@ -6,7 +8,6 @@ require 'delorean/ruby/whitelists/default'
6
8
  require 'delorean/cache'
7
9
 
8
10
  module Delorean
9
-
10
11
  ::Delorean::Ruby.whitelist = ::Delorean::Ruby::Whitelists::Default.new
11
12
 
12
13
  ::Delorean::Cache.adapter = ::Delorean::Cache::Adapters::RubyCache.new(
@@ -22,7 +23,7 @@ module Delorean
22
23
  # This is pretty awful. NOTE: can't sanitize params as Marty
23
24
  # patches NodeCall and modifies params to send _parent_id.
24
25
  # This whole thing needs to be redone.
25
- @cp ||= Hash[params]
26
+ @cloned_params ||= Hash[params]
26
27
  end
27
28
 
28
29
  def evaluate(attr)
@@ -30,30 +31,28 @@ module Delorean
30
31
  end
31
32
 
32
33
  def /(args)
33
- begin
34
- case args
35
- when Array
36
- engine.eval_to_hash(node, args, cloned_params)
37
- when String
38
- self.evaluate(args)
39
- else
40
- raise "non-array/string arg to /"
41
- end
42
- rescue => exc
43
- Delorean::Engine.grok_runtime_exception(exc)
34
+ case args
35
+ when Array
36
+ engine.eval_to_hash(node, args, cloned_params)
37
+ when String
38
+ evaluate(args)
39
+ else
40
+ raise 'non-array/string arg to /'
44
41
  end
42
+ rescue StandardError => exc
43
+ Delorean::Engine.grok_runtime_exception(exc)
45
44
  end
46
45
 
47
46
  # FIXME: % should also support string as args
48
47
  def %(args)
49
- raise "non-array arg to %" unless args.is_a?(Array)
48
+ raise 'non-array arg to %' unless args.is_a?(Array)
50
49
 
51
50
  engine.eval_to_hash(node, args, cloned_params)
52
51
  end
53
52
 
54
53
  # add new arguments, results in a new NodeCall
55
54
  def +(args)
56
- raise "bad arg to %" unless args.is_a?(Hash)
55
+ raise 'bad arg to %' unless args.is_a?(Hash)
57
56
 
58
57
  NodeCall.new(_e, engine, node, params.merge(args))
59
58
  end
@@ -72,6 +71,7 @@ module Delorean
72
71
  # {}.length. i.e. length is a whitelisted function, but not
73
72
  # an attr. This implementation returns nil instead of 0.
74
73
  return obj[attr] if obj.member?(attr)
74
+
75
75
  return attr.is_a?(String) ? obj[attr.to_sym] : nil
76
76
  end
77
77
 
@@ -91,9 +91,11 @@ module Delorean
91
91
 
92
92
  begin
93
93
  return _instance_call(obj, attr, [], _e)
94
- rescue => exc
95
- raise InvalidGetAttribute,
96
- "attr lookup failed: '#{attr}' on <#{obj.class}> #{obj} - #{exc}"
94
+ rescue StandardError => exc
95
+ raise(
96
+ InvalidGetAttribute,
97
+ "attr lookup failed: '#{attr}' on <#{obj.class}> #{obj} - #{exc}"
98
+ )
97
99
  end
98
100
  end
99
101
 
@@ -105,14 +107,16 @@ module Delorean
105
107
  when nil
106
108
  # FIXME: even Javascript which is superpermissive raises an
107
109
  # exception on null getattr.
108
- return nil
110
+ nil
109
111
  when Hash, NodeCall, Class, OpenStruct
110
112
  raise InvalidIndex unless args.length == 1
113
+
111
114
  _get_attr(obj, args[0], _e)
112
115
  when Array, String, MatchData
113
116
  raise InvalidIndex unless args.length <= 2 &&
114
117
  args[0].is_a?(Integer) &&
115
118
  (args[1].nil? || args[1].is_a?(Integer))
119
+
116
120
  obj[*args]
117
121
  else
118
122
  raise InvalidIndex
@@ -122,8 +126,7 @@ module Delorean
122
126
  ######################################################################
123
127
 
124
128
  def self._sanitize_hash(_e)
125
- _e.each_with_object({}) do
126
- |(k,v), h|
129
+ _e.each_with_object({}) do |(k, v), h|
127
130
  h[k] = v if k.is_a?(Integer) || k =~ /\A[a-z][A-Za-z0-9_]*\z/
128
131
  end
129
132
  end
@@ -131,7 +134,7 @@ module Delorean
131
134
  ######################################################################
132
135
 
133
136
  def self._err(*args)
134
- str = args.map(&:to_s).join(", ")
137
+ str = args.map(&:to_s).join(', ')
135
138
  raise str
136
139
  end
137
140
 
@@ -164,15 +167,15 @@ module Delorean
164
167
  return obj.send(msg, *args)
165
168
  end
166
169
 
167
- cls = obj.class
168
-
169
170
  matcher = ::Delorean::Ruby.whitelist.matcher(method_name: msg)
170
171
 
171
172
  raise "no such method #{method}" unless matcher
172
173
 
173
- return(
174
- _instance_call(obj, matcher.match_to, args, _e)
175
- ) if matcher.match_to?
174
+ if matcher.match_to?
175
+ return(
176
+ _instance_call(obj, matcher.match_to, args, _e)
177
+ )
178
+ end
176
179
 
177
180
  matcher.match!(klass: obj.class, args: args)
178
181
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'delorean/cache/adapters'
2
4
 
3
5
  module Delorean
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'delorean/cache/adapters/ruby_cache'
2
4
 
3
5
  module Delorean
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Delorean
2
4
  module Cache
3
5
  module Adapters
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative './base'
2
4
 
3
5
  module Delorean
@@ -20,14 +22,17 @@ module Delorean
20
22
  def fetch_item(klass:, cache_key:, default: nil)
21
23
  subh = lookup_cache.fetch(klass, default)
22
24
  return default if subh == default
25
+
23
26
  v = subh.fetch(cache_key, default)
24
27
  return default if v == default
28
+
25
29
  v
26
30
  end
27
31
 
28
32
  def cache_key(klass:, method_name:, args:)
29
33
  [method_name] + args.map do |arg|
30
34
  next arg.id if arg.respond_to?(:id)
35
+
31
36
  arg
32
37
  end.freeze
33
38
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Delorean
2
- SIG = "_SIG"
3
- MOD = "DELOREAN__"
4
- POST = "__D"
4
+ SIG = '_SIG'.freeze
5
+ MOD = 'DELOREAN__'.freeze
6
+ POST = '__D'.freeze
5
7
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Delorean
2
4
  class Debug
3
5
  @debug_set = Set[]
@@ -8,15 +10,14 @@ module Delorean
8
10
  end
9
11
 
10
12
  def self.log(obj)
11
- File.open(@log_file, 'a+') {
12
- |f|
13
+ File.open(@log_file, 'a+') do |f|
13
14
  f.write obj.inspect
14
15
  f.write "\n"
15
- }
16
+ end
16
17
  end
17
18
 
18
- def self.debug_set
19
- @debug_set
19
+ class << self
20
+ attr_reader :debug_set
20
21
  end
21
22
  end
22
23
  end
@@ -140,7 +140,6 @@ module Delorean
140
140
  def m
141
141
  elements[0]
142
142
  end
143
-
144
143
  end
145
144
 
146
145
  module Formula4
@@ -151,20 +150,37 @@ module Delorean
151
150
  def mod
152
151
  elements[3]
153
152
  end
153
+ end
154
+
155
+ module Formula5
156
+ def m
157
+ elements[0]
158
+ end
159
+
160
+ end
161
+
162
+ module Formula6
163
+ def n
164
+ elements[0]
165
+ end
166
+
167
+ def mod
168
+ elements[3]
169
+ end
154
170
 
155
171
  def p
156
172
  elements[4]
157
173
  end
158
174
  end
159
175
 
160
- module Formula5
176
+ module Formula7
161
177
  def n
162
178
  elements[0]
163
179
  end
164
180
 
165
181
  end
166
182
 
167
- module Formula6
183
+ module Formula8
168
184
  def sp
169
185
  elements[1]
170
186
  end
@@ -344,41 +360,22 @@ module Delorean
344
360
  end
345
361
  s25 << r28
346
362
  if r28
347
- i31, s31 = index, []
348
- r32 = _nt_class_name
349
- s31 << r32
350
- if r32
351
- if (match_len = has_terminal?('::', false, index))
352
- r33 = instantiate_node(SyntaxNode,input, index...(index + match_len))
353
- @index += match_len
354
- else
355
- terminal_parse_failure('\'::\'')
356
- r33 = nil
357
- end
358
- s31 << r33
359
- end
360
- if s31.last
361
- r31 = instantiate_node(SyntaxNode,input, i31...index, s31)
362
- r31.extend(Formula3)
363
+ i30, s30 = index, []
364
+ r31 = _nt_class_name_import_nested
365
+ s30 << r31
366
+ if s30.last
367
+ r30 = instantiate_node(SyntaxNode,input, i30...index, s30)
368
+ r30.extend(Formula3)
363
369
  else
364
- @index = i31
365
- r31 = nil
366
- end
367
- if r31
368
- r30 = r31
369
- else
370
- r30 = instantiate_node(SyntaxNode,input, index...index)
370
+ @index = i30
371
+ r30 = nil
371
372
  end
372
373
  s25 << r30
373
- if r30
374
- r34 = _nt_class_name
375
- s25 << r34
376
- end
377
374
  end
378
375
  end
379
376
  end
380
377
  if s25.last
381
- r25 = instantiate_node(SubNode,input, i25...index, s25)
378
+ r25 = instantiate_node(SubNodeNested,input, i25...index, s25)
382
379
  r25.extend(Formula4)
383
380
  else
384
381
  @index = i25
@@ -388,60 +385,126 @@ module Delorean
388
385
  r25 = SyntaxNode.new(input, (index-1)...index) if r25 == true
389
386
  r0 = r25
390
387
  else
391
- i35, s35 = index, []
392
- r36 = _nt_class_name
393
- s35 << r36
394
- if r36
388
+ i32, s32 = index, []
389
+ r33 = _nt_class_name
390
+ s32 << r33
391
+ if r33
395
392
  if (match_len = has_terminal?(':', false, index))
396
- r37 = true
393
+ r34 = true
397
394
  @index += match_len
398
395
  else
399
396
  terminal_parse_failure('\':\'')
400
- r37 = nil
397
+ r34 = nil
398
+ end
399
+ s32 << r34
400
+ if r34
401
+ r36 = _nt_sp
402
+ if r36
403
+ r35 = r36
404
+ else
405
+ r35 = instantiate_node(SyntaxNode,input, index...index)
406
+ end
407
+ s32 << r35
408
+ if r35
409
+ i38, s38 = index, []
410
+ r39 = _nt_class_name
411
+ s38 << r39
412
+ if r39
413
+ if (match_len = has_terminal?('::', false, index))
414
+ r40 = instantiate_node(SyntaxNode,input, index...(index + match_len))
415
+ @index += match_len
416
+ else
417
+ terminal_parse_failure('\'::\'')
418
+ r40 = nil
419
+ end
420
+ s38 << r40
421
+ end
422
+ if s38.last
423
+ r38 = instantiate_node(SyntaxNode,input, i38...index, s38)
424
+ r38.extend(Formula5)
425
+ else
426
+ @index = i38
427
+ r38 = nil
428
+ end
429
+ if r38
430
+ r37 = r38
431
+ else
432
+ r37 = instantiate_node(SyntaxNode,input, index...index)
433
+ end
434
+ s32 << r37
435
+ if r37
436
+ r41 = _nt_class_name
437
+ s32 << r41
438
+ end
439
+ end
401
440
  end
402
- s35 << r37
403
441
  end
404
- if s35.last
405
- r35 = instantiate_node(BaseNode,input, i35...index, s35)
406
- r35.extend(Formula5)
442
+ if s32.last
443
+ r32 = instantiate_node(SubNode,input, i32...index, s32)
444
+ r32.extend(Formula6)
407
445
  else
408
- @index = i35
409
- r35 = nil
446
+ @index = i32
447
+ r32 = nil
410
448
  end
411
- if r35
412
- r35 = SyntaxNode.new(input, (index-1)...index) if r35 == true
413
- r0 = r35
449
+ if r32
450
+ r32 = SyntaxNode.new(input, (index-1)...index) if r32 == true
451
+ r0 = r32
414
452
  else
415
- i38, s38 = index, []
416
- if (match_len = has_terminal?('import', false, index))
417
- r39 = instantiate_node(SyntaxNode,input, index...(index + match_len))
418
- @index += match_len
419
- else
420
- terminal_parse_failure('\'import\'')
421
- r39 = nil
422
- end
423
- s38 << r39
424
- if r39
425
- r40 = _nt_sp
426
- s38 << r40
427
- if r40
428
- r41 = _nt_class_name
429
- s38 << r41
453
+ i42, s42 = index, []
454
+ r43 = _nt_class_name
455
+ s42 << r43
456
+ if r43
457
+ if (match_len = has_terminal?(':', false, index))
458
+ r44 = true
459
+ @index += match_len
460
+ else
461
+ terminal_parse_failure('\':\'')
462
+ r44 = nil
430
463
  end
464
+ s42 << r44
431
465
  end
432
- if s38.last
433
- r38 = instantiate_node(Import,input, i38...index, s38)
434
- r38.extend(Formula6)
466
+ if s42.last
467
+ r42 = instantiate_node(BaseNode,input, i42...index, s42)
468
+ r42.extend(Formula7)
435
469
  else
436
- @index = i38
437
- r38 = nil
470
+ @index = i42
471
+ r42 = nil
438
472
  end
439
- if r38
440
- r38 = SyntaxNode.new(input, (index-1)...index) if r38 == true
441
- r0 = r38
473
+ if r42
474
+ r42 = SyntaxNode.new(input, (index-1)...index) if r42 == true
475
+ r0 = r42
442
476
  else
443
- @index = i0
444
- r0 = nil
477
+ i45, s45 = index, []
478
+ if (match_len = has_terminal?('import', false, index))
479
+ r46 = instantiate_node(SyntaxNode,input, index...(index + match_len))
480
+ @index += match_len
481
+ else
482
+ terminal_parse_failure('\'import\'')
483
+ r46 = nil
484
+ end
485
+ s45 << r46
486
+ if r46
487
+ r47 = _nt_sp
488
+ s45 << r47
489
+ if r47
490
+ r48 = _nt_class_name_import
491
+ s45 << r48
492
+ end
493
+ end
494
+ if s45.last
495
+ r45 = instantiate_node(Import,input, i45...index, s45)
496
+ r45.extend(Formula8)
497
+ else
498
+ @index = i45
499
+ r45 = nil
500
+ end
501
+ if r45
502
+ r45 = SyntaxNode.new(input, (index-1)...index) if r45 == true
503
+ r0 = r45
504
+ else
505
+ @index = i0
506
+ r0 = nil
507
+ end
445
508
  end
446
509
  end
447
510
  end
@@ -509,6 +572,241 @@ module Delorean
509
572
  r0
510
573
  end
511
574
 
575
+ module ClassNameImport0
576
+ end
577
+
578
+ module ClassNameImport1
579
+ end
580
+
581
+ def _nt_class_name_import
582
+ start_index = index
583
+ if node_cache[:class_name_import].has_key?(index)
584
+ cached = node_cache[:class_name_import][index]
585
+ if cached
586
+ node_cache[:class_name_import][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
587
+ @index = cached.interval.end
588
+ end
589
+ return cached
590
+ end
591
+
592
+ i0, s0 = index, []
593
+ if has_terminal?(@regexps[gr = '\A[A-Z]'] ||= Regexp.new(gr), :regexp, index)
594
+ r1 = true
595
+ @index += 1
596
+ else
597
+ terminal_parse_failure('[A-Z]')
598
+ r1 = nil
599
+ end
600
+ s0 << r1
601
+ if r1
602
+ s2, i2 = [], index
603
+ loop do
604
+ if has_terminal?(@regexps[gr = '\A[a-zA-Z0-9_]'] ||= Regexp.new(gr), :regexp, index)
605
+ r3 = true
606
+ @index += 1
607
+ else
608
+ terminal_parse_failure('[a-zA-Z0-9_]')
609
+ r3 = nil
610
+ end
611
+ if r3
612
+ s2 << r3
613
+ else
614
+ break
615
+ end
616
+ end
617
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
618
+ s0 << r2
619
+ if r2
620
+ s4, i4 = [], index
621
+ loop do
622
+ i5, s5 = index, []
623
+ if (match_len = has_terminal?('::', false, index))
624
+ r6 = instantiate_node(SyntaxNode,input, index...(index + match_len))
625
+ @index += match_len
626
+ else
627
+ terminal_parse_failure('\'::\'')
628
+ r6 = nil
629
+ end
630
+ s5 << r6
631
+ if r6
632
+ if has_terminal?(@regexps[gr = '\A[A-Z]'] ||= Regexp.new(gr), :regexp, index)
633
+ r7 = true
634
+ @index += 1
635
+ else
636
+ terminal_parse_failure('[A-Z]')
637
+ r7 = nil
638
+ end
639
+ s5 << r7
640
+ if r7
641
+ s8, i8 = [], index
642
+ loop do
643
+ if has_terminal?(@regexps[gr = '\A[a-zA-Z0-9_]'] ||= Regexp.new(gr), :regexp, index)
644
+ r9 = true
645
+ @index += 1
646
+ else
647
+ terminal_parse_failure('[a-zA-Z0-9_]')
648
+ r9 = nil
649
+ end
650
+ if r9
651
+ s8 << r9
652
+ else
653
+ break
654
+ end
655
+ end
656
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
657
+ s5 << r8
658
+ end
659
+ end
660
+ if s5.last
661
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
662
+ r5.extend(ClassNameImport0)
663
+ else
664
+ @index = i5
665
+ r5 = nil
666
+ end
667
+ if r5
668
+ s4 << r5
669
+ else
670
+ break
671
+ end
672
+ end
673
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
674
+ s0 << r4
675
+ end
676
+ end
677
+ if s0.last
678
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
679
+ r0.extend(ClassNameImport1)
680
+ else
681
+ @index = i0
682
+ r0 = nil
683
+ end
684
+
685
+ node_cache[:class_name_import][start_index] = r0
686
+
687
+ r0
688
+ end
689
+
690
+ module ClassNameImportNested0
691
+ end
692
+
693
+ module ClassNameImportNested1
694
+ end
695
+
696
+ def _nt_class_name_import_nested
697
+ start_index = index
698
+ if node_cache[:class_name_import_nested].has_key?(index)
699
+ cached = node_cache[:class_name_import_nested][index]
700
+ if cached
701
+ node_cache[:class_name_import_nested][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
702
+ @index = cached.interval.end
703
+ end
704
+ return cached
705
+ end
706
+
707
+ i0, s0 = index, []
708
+ if has_terminal?(@regexps[gr = '\A[A-Z]'] ||= Regexp.new(gr), :regexp, index)
709
+ r1 = true
710
+ @index += 1
711
+ else
712
+ terminal_parse_failure('[A-Z]')
713
+ r1 = nil
714
+ end
715
+ s0 << r1
716
+ if r1
717
+ s2, i2 = [], index
718
+ loop do
719
+ if has_terminal?(@regexps[gr = '\A[a-zA-Z0-9_]'] ||= Regexp.new(gr), :regexp, index)
720
+ r3 = true
721
+ @index += 1
722
+ else
723
+ terminal_parse_failure('[a-zA-Z0-9_]')
724
+ r3 = nil
725
+ end
726
+ if r3
727
+ s2 << r3
728
+ else
729
+ break
730
+ end
731
+ end
732
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
733
+ s0 << r2
734
+ if r2
735
+ s4, i4 = [], index
736
+ loop do
737
+ i5, s5 = index, []
738
+ if (match_len = has_terminal?('::', false, index))
739
+ r6 = instantiate_node(SyntaxNode,input, index...(index + match_len))
740
+ @index += match_len
741
+ else
742
+ terminal_parse_failure('\'::\'')
743
+ r6 = nil
744
+ end
745
+ s5 << r6
746
+ if r6
747
+ if has_terminal?(@regexps[gr = '\A[A-Z]'] ||= Regexp.new(gr), :regexp, index)
748
+ r7 = true
749
+ @index += 1
750
+ else
751
+ terminal_parse_failure('[A-Z]')
752
+ r7 = nil
753
+ end
754
+ s5 << r7
755
+ if r7
756
+ s8, i8 = [], index
757
+ loop do
758
+ if has_terminal?(@regexps[gr = '\A[a-zA-Z0-9_]'] ||= Regexp.new(gr), :regexp, index)
759
+ r9 = true
760
+ @index += 1
761
+ else
762
+ terminal_parse_failure('[a-zA-Z0-9_]')
763
+ r9 = nil
764
+ end
765
+ if r9
766
+ s8 << r9
767
+ else
768
+ break
769
+ end
770
+ end
771
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
772
+ s5 << r8
773
+ end
774
+ end
775
+ if s5.last
776
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
777
+ r5.extend(ClassNameImportNested0)
778
+ else
779
+ @index = i5
780
+ r5 = nil
781
+ end
782
+ if r5
783
+ s4 << r5
784
+ else
785
+ break
786
+ end
787
+ end
788
+ if s4.size < 2
789
+ @index = i4
790
+ r4 = nil
791
+ else
792
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
793
+ end
794
+ s0 << r4
795
+ end
796
+ end
797
+ if s0.last
798
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
799
+ r0.extend(ClassNameImportNested1)
800
+ else
801
+ @index = i0
802
+ r0 = nil
803
+ end
804
+
805
+ node_cache[:class_name_import_nested][start_index] = r0
806
+
807
+ r0
808
+ end
809
+
512
810
  module Expression0
513
811
  def args
514
812
  elements[2]
@@ -2455,13 +2753,19 @@ module Delorean
2455
2753
  end
2456
2754
 
2457
2755
  module Value0
2756
+ def c
2757
+ elements[0]
2758
+ end
2759
+ end
2760
+
2761
+ module Value1
2458
2762
  def m
2459
2763
  elements[0]
2460
2764
  end
2461
2765
 
2462
2766
  end
2463
2767
 
2464
- module Value1
2768
+ module Value2
2465
2769
  def mod
2466
2770
  elements[0]
2467
2771
  end
@@ -2471,7 +2775,7 @@ module Delorean
2471
2775
  end
2472
2776
  end
2473
2777
 
2474
- module Value2
2778
+ module Value3
2475
2779
  def e
2476
2780
  elements[2]
2477
2781
  end
@@ -2546,39 +2850,11 @@ module Delorean
2546
2850
  r0 = r11
2547
2851
  else
2548
2852
  i12, s12 = index, []
2549
- i14, s14 = index, []
2550
- r15 = _nt_class_name
2551
- s14 << r15
2552
- if r15
2553
- if (match_len = has_terminal?('::', false, index))
2554
- r16 = instantiate_node(SyntaxNode,input, index...(index + match_len))
2555
- @index += match_len
2556
- else
2557
- terminal_parse_failure('\'::\'')
2558
- r16 = nil
2559
- end
2560
- s14 << r16
2561
- end
2562
- if s14.last
2563
- r14 = instantiate_node(SyntaxNode,input, i14...index, s14)
2564
- r14.extend(Value0)
2565
- else
2566
- @index = i14
2567
- r14 = nil
2568
- end
2569
- if r14
2570
- r13 = r14
2571
- else
2572
- r13 = instantiate_node(SyntaxNode,input, index...index)
2573
- end
2853
+ r13 = _nt_class_name_import
2574
2854
  s12 << r13
2575
- if r13
2576
- r17 = _nt_class_name
2577
- s12 << r17
2578
- end
2579
2855
  if s12.last
2580
- r12 = instantiate_node(NodeAsValue,input, i12...index, s12)
2581
- r12.extend(Value1)
2856
+ r12 = instantiate_node(NodeAsValueNested,input, i12...index, s12)
2857
+ r12.extend(Value0)
2582
2858
  else
2583
2859
  @index = i12
2584
2860
  r12 = nil
@@ -2587,60 +2863,103 @@ module Delorean
2587
2863
  r12 = SyntaxNode.new(input, (index-1)...index) if r12 == true
2588
2864
  r0 = r12
2589
2865
  else
2590
- i18, s18 = index, []
2591
- if (match_len = has_terminal?('(', false, index))
2592
- r19 = true
2593
- @index += match_len
2866
+ i14, s14 = index, []
2867
+ i16, s16 = index, []
2868
+ r17 = _nt_class_name
2869
+ s16 << r17
2870
+ if r17
2871
+ if (match_len = has_terminal?('::', false, index))
2872
+ r18 = instantiate_node(SyntaxNode,input, index...(index + match_len))
2873
+ @index += match_len
2874
+ else
2875
+ terminal_parse_failure('\'::\'')
2876
+ r18 = nil
2877
+ end
2878
+ s16 << r18
2879
+ end
2880
+ if s16.last
2881
+ r16 = instantiate_node(SyntaxNode,input, i16...index, s16)
2882
+ r16.extend(Value1)
2594
2883
  else
2595
- terminal_parse_failure('\'(\'')
2596
- r19 = nil
2884
+ @index = i16
2885
+ r16 = nil
2597
2886
  end
2598
- s18 << r19
2599
- if r19
2600
- r21 = _nt_sp
2601
- if r21
2602
- r20 = r21
2887
+ if r16
2888
+ r15 = r16
2889
+ else
2890
+ r15 = instantiate_node(SyntaxNode,input, index...index)
2891
+ end
2892
+ s14 << r15
2893
+ if r15
2894
+ r19 = _nt_class_name
2895
+ s14 << r19
2896
+ end
2897
+ if s14.last
2898
+ r14 = instantiate_node(NodeAsValue,input, i14...index, s14)
2899
+ r14.extend(Value2)
2900
+ else
2901
+ @index = i14
2902
+ r14 = nil
2903
+ end
2904
+ if r14
2905
+ r14 = SyntaxNode.new(input, (index-1)...index) if r14 == true
2906
+ r0 = r14
2907
+ else
2908
+ i20, s20 = index, []
2909
+ if (match_len = has_terminal?('(', false, index))
2910
+ r21 = true
2911
+ @index += match_len
2603
2912
  else
2604
- r20 = instantiate_node(SyntaxNode,input, index...index)
2913
+ terminal_parse_failure('\'(\'')
2914
+ r21 = nil
2605
2915
  end
2606
- s18 << r20
2607
- if r20
2608
- r22 = _nt_expression
2609
- s18 << r22
2916
+ s20 << r21
2917
+ if r21
2918
+ r23 = _nt_sp
2919
+ if r23
2920
+ r22 = r23
2921
+ else
2922
+ r22 = instantiate_node(SyntaxNode,input, index...index)
2923
+ end
2924
+ s20 << r22
2610
2925
  if r22
2611
- r24 = _nt_sp
2926
+ r24 = _nt_expression
2927
+ s20 << r24
2612
2928
  if r24
2613
- r23 = r24
2614
- else
2615
- r23 = instantiate_node(SyntaxNode,input, index...index)
2616
- end
2617
- s18 << r23
2618
- if r23
2619
- if (match_len = has_terminal?(')', false, index))
2620
- r25 = true
2621
- @index += match_len
2929
+ r26 = _nt_sp
2930
+ if r26
2931
+ r25 = r26
2622
2932
  else
2623
- terminal_parse_failure('\')\'')
2624
- r25 = nil
2933
+ r25 = instantiate_node(SyntaxNode,input, index...index)
2934
+ end
2935
+ s20 << r25
2936
+ if r25
2937
+ if (match_len = has_terminal?(')', false, index))
2938
+ r27 = true
2939
+ @index += match_len
2940
+ else
2941
+ terminal_parse_failure('\')\'')
2942
+ r27 = nil
2943
+ end
2944
+ s20 << r27
2625
2945
  end
2626
- s18 << r25
2627
2946
  end
2628
2947
  end
2629
2948
  end
2630
- end
2631
- if s18.last
2632
- r18 = instantiate_node(Expr,input, i18...index, s18)
2633
- r18.extend(Value2)
2634
- else
2635
- @index = i18
2636
- r18 = nil
2637
- end
2638
- if r18
2639
- r18 = SyntaxNode.new(input, (index-1)...index) if r18 == true
2640
- r0 = r18
2641
- else
2642
- @index = i0
2643
- r0 = nil
2949
+ if s20.last
2950
+ r20 = instantiate_node(Expr,input, i20...index, s20)
2951
+ r20.extend(Value3)
2952
+ else
2953
+ @index = i20
2954
+ r20 = nil
2955
+ end
2956
+ if r20
2957
+ r20 = SyntaxNode.new(input, (index-1)...index) if r20 == true
2958
+ r0 = r20
2959
+ else
2960
+ @index = i0
2961
+ r0 = nil
2962
+ end
2644
2963
  end
2645
2964
  end
2646
2965
  end