delorean_lang 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
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