delorean_lang 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
data/delorean.gemspec CHANGED
@@ -21,4 +21,5 @@ Gem::Specification.new do |gem|
21
21
  gem.add_development_dependency "rspec", '~> 2.1'
22
22
  gem.add_development_dependency "sqlite3", '~> 1.3.10'
23
23
  gem.add_development_dependency "pry"
24
+ gem.add_development_dependency "rubocop"
24
25
  end
data/lib/delorean/base.rb CHANGED
@@ -9,7 +9,9 @@ module Delorean
9
9
 
10
10
  ::Delorean::Ruby.whitelist = ::Delorean::Ruby::Whitelists::Default.new
11
11
 
12
- ::Delorean::Cache.adapter = ::Delorean::Cache::Adapters::RubyCache.new(size_per_class: 1000)
12
+ ::Delorean::Cache.adapter = ::Delorean::Cache::Adapters::RubyCache.new(
13
+ size_per_class: 1000
14
+ )
13
15
 
14
16
  module BaseModule
15
17
  # _e is used by Marty promise_jobs to pass promise-related
@@ -914,21 +914,21 @@ module Delorean
914
914
  end
915
915
 
916
916
  module DotExp1
917
- def i
918
- elements[2]
919
- end
920
-
921
917
  def al
922
- elements[5]
918
+ elements[2]
923
919
  end
924
920
 
925
921
  end
926
922
 
927
923
  module DotExp2
928
- def al
924
+ def i
929
925
  elements[2]
930
926
  end
931
927
 
928
+ def al
929
+ elements[5]
930
+ end
931
+
932
932
  end
933
933
 
934
934
  module DotExp3
@@ -1002,11 +1002,11 @@ module Delorean
1002
1002
  r0 = r1
1003
1003
  else
1004
1004
  i9, s9 = index, []
1005
- if (match_len = has_terminal?('.', false, index))
1005
+ if (match_len = has_terminal?('(', false, index))
1006
1006
  r10 = true
1007
1007
  @index += match_len
1008
1008
  else
1009
- terminal_parse_failure('\'.\'')
1009
+ terminal_parse_failure('\'(\'')
1010
1010
  r10 = nil
1011
1011
  end
1012
1012
  s9 << r10
@@ -1019,59 +1019,36 @@ module Delorean
1019
1019
  end
1020
1020
  s9 << r11
1021
1021
  if r11
1022
- r13 = _nt_identifier
1022
+ r14 = _nt_kw_args
1023
+ if r14
1024
+ r13 = r14
1025
+ else
1026
+ r13 = instantiate_node(SyntaxNode,input, index...index)
1027
+ end
1023
1028
  s9 << r13
1024
1029
  if r13
1025
- if (match_len = has_terminal?('(', false, index))
1026
- r14 = true
1027
- @index += match_len
1030
+ r16 = _nt_sp
1031
+ if r16
1032
+ r15 = r16
1028
1033
  else
1029
- terminal_parse_failure('\'(\'')
1030
- r14 = nil
1034
+ r15 = instantiate_node(SyntaxNode,input, index...index)
1031
1035
  end
1032
- s9 << r14
1033
- if r14
1034
- r16 = _nt_sp
1035
- if r16
1036
- r15 = r16
1036
+ s9 << r15
1037
+ if r15
1038
+ if (match_len = has_terminal?(')', false, index))
1039
+ r17 = true
1040
+ @index += match_len
1037
1041
  else
1038
- r15 = instantiate_node(SyntaxNode,input, index...index)
1039
- end
1040
- s9 << r15
1041
- if r15
1042
- r18 = _nt_fn_args
1043
- if r18
1044
- r17 = r18
1045
- else
1046
- r17 = instantiate_node(SyntaxNode,input, index...index)
1047
- end
1048
- s9 << r17
1049
- if r17
1050
- r20 = _nt_sp
1051
- if r20
1052
- r19 = r20
1053
- else
1054
- r19 = instantiate_node(SyntaxNode,input, index...index)
1055
- end
1056
- s9 << r19
1057
- if r19
1058
- if (match_len = has_terminal?(')', false, index))
1059
- r21 = true
1060
- @index += match_len
1061
- else
1062
- terminal_parse_failure('\')\'')
1063
- r21 = nil
1064
- end
1065
- s9 << r21
1066
- end
1067
- end
1042
+ terminal_parse_failure('\')\'')
1043
+ r17 = nil
1068
1044
  end
1045
+ s9 << r17
1069
1046
  end
1070
1047
  end
1071
1048
  end
1072
1049
  end
1073
1050
  if s9.last
1074
- r9 = instantiate_node(Call,input, i9...index, s9)
1051
+ r9 = instantiate_node(NodeCall,input, i9...index, s9)
1075
1052
  r9.extend(DotExp1)
1076
1053
  else
1077
1054
  @index = i9
@@ -1081,62 +1058,85 @@ module Delorean
1081
1058
  r9 = SyntaxNode.new(input, (index-1)...index) if r9 == true
1082
1059
  r0 = r9
1083
1060
  else
1084
- i22, s22 = index, []
1085
- if (match_len = has_terminal?('(', false, index))
1086
- r23 = true
1061
+ i18, s18 = index, []
1062
+ if (match_len = has_terminal?('.', false, index))
1063
+ r19 = true
1087
1064
  @index += match_len
1088
1065
  else
1089
- terminal_parse_failure('\'(\'')
1090
- r23 = nil
1091
- end
1092
- s22 << r23
1093
- if r23
1094
- r25 = _nt_sp
1095
- if r25
1096
- r24 = r25
1066
+ terminal_parse_failure('\'.\'')
1067
+ r19 = nil
1068
+ end
1069
+ s18 << r19
1070
+ if r19
1071
+ r21 = _nt_sp
1072
+ if r21
1073
+ r20 = r21
1097
1074
  else
1098
- r24 = instantiate_node(SyntaxNode,input, index...index)
1099
- end
1100
- s22 << r24
1101
- if r24
1102
- r27 = _nt_kw_args
1103
- if r27
1104
- r26 = r27
1105
- else
1106
- r26 = instantiate_node(SyntaxNode,input, index...index)
1107
- end
1108
- s22 << r26
1109
- if r26
1110
- r29 = _nt_sp
1111
- if r29
1112
- r28 = r29
1075
+ r20 = instantiate_node(SyntaxNode,input, index...index)
1076
+ end
1077
+ s18 << r20
1078
+ if r20
1079
+ r22 = _nt_identifier
1080
+ s18 << r22
1081
+ if r22
1082
+ if (match_len = has_terminal?('(', false, index))
1083
+ r23 = true
1084
+ @index += match_len
1113
1085
  else
1114
- r28 = instantiate_node(SyntaxNode,input, index...index)
1086
+ terminal_parse_failure('\'(\'')
1087
+ r23 = nil
1115
1088
  end
1116
- s22 << r28
1117
- if r28
1118
- if (match_len = has_terminal?(')', false, index))
1119
- r30 = true
1120
- @index += match_len
1089
+ s18 << r23
1090
+ if r23
1091
+ r25 = _nt_sp
1092
+ if r25
1093
+ r24 = r25
1121
1094
  else
1122
- terminal_parse_failure('\')\'')
1123
- r30 = nil
1095
+ r24 = instantiate_node(SyntaxNode,input, index...index)
1096
+ end
1097
+ s18 << r24
1098
+ if r24
1099
+ r27 = _nt_fn_args
1100
+ if r27
1101
+ r26 = r27
1102
+ else
1103
+ r26 = instantiate_node(SyntaxNode,input, index...index)
1104
+ end
1105
+ s18 << r26
1106
+ if r26
1107
+ r29 = _nt_sp
1108
+ if r29
1109
+ r28 = r29
1110
+ else
1111
+ r28 = instantiate_node(SyntaxNode,input, index...index)
1112
+ end
1113
+ s18 << r28
1114
+ if r28
1115
+ if (match_len = has_terminal?(')', false, index))
1116
+ r30 = true
1117
+ @index += match_len
1118
+ else
1119
+ terminal_parse_failure('\')\'')
1120
+ r30 = nil
1121
+ end
1122
+ s18 << r30
1123
+ end
1124
+ end
1124
1125
  end
1125
- s22 << r30
1126
1126
  end
1127
1127
  end
1128
1128
  end
1129
1129
  end
1130
- if s22.last
1131
- r22 = instantiate_node(NodeCall,input, i22...index, s22)
1132
- r22.extend(DotExp2)
1130
+ if s18.last
1131
+ r18 = instantiate_node(Call,input, i18...index, s18)
1132
+ r18.extend(DotExp2)
1133
1133
  else
1134
- @index = i22
1135
- r22 = nil
1134
+ @index = i18
1135
+ r18 = nil
1136
1136
  end
1137
- if r22
1138
- r22 = SyntaxNode.new(input, (index-1)...index) if r22 == true
1139
- r0 = r22
1137
+ if r18
1138
+ r18 = SyntaxNode.new(input, (index-1)...index) if r18 == true
1139
+ r0 = r18
1140
1140
  else
1141
1141
  i31, s31 = index, []
1142
1142
  if (match_len = has_terminal?('.', false, index))
@@ -2520,122 +2520,128 @@ module Delorean
2520
2520
  r6 = SyntaxNode.new(input, (index-1)...index) if r6 == true
2521
2521
  r0 = r6
2522
2522
  else
2523
- r7 = _nt_self
2523
+ r7 = _nt_sup
2524
2524
  if r7
2525
2525
  r7 = SyntaxNode.new(input, (index-1)...index) if r7 == true
2526
2526
  r0 = r7
2527
2527
  else
2528
- r8 = _nt_list_expr
2528
+ r8 = _nt_self
2529
2529
  if r8
2530
2530
  r8 = SyntaxNode.new(input, (index-1)...index) if r8 == true
2531
2531
  r0 = r8
2532
2532
  else
2533
- r9 = _nt_set_expr
2533
+ r9 = _nt_list_expr
2534
2534
  if r9
2535
2535
  r9 = SyntaxNode.new(input, (index-1)...index) if r9 == true
2536
2536
  r0 = r9
2537
2537
  else
2538
- r10 = _nt_hash_expr
2538
+ r10 = _nt_set_expr
2539
2539
  if r10
2540
2540
  r10 = SyntaxNode.new(input, (index-1)...index) if r10 == true
2541
2541
  r0 = r10
2542
2542
  else
2543
- i11, s11 = index, []
2544
- i13, s13 = index, []
2545
- r14 = _nt_class_name
2546
- s13 << r14
2547
- if r14
2548
- if (match_len = has_terminal?('::', false, index))
2549
- r15 = instantiate_node(SyntaxNode,input, index...(index + match_len))
2550
- @index += match_len
2551
- else
2552
- terminal_parse_failure('\'::\'')
2553
- r15 = nil
2554
- end
2555
- s13 << r15
2556
- end
2557
- if s13.last
2558
- r13 = instantiate_node(SyntaxNode,input, i13...index, s13)
2559
- r13.extend(Value0)
2560
- else
2561
- @index = i13
2562
- r13 = nil
2563
- end
2564
- if r13
2565
- r12 = r13
2566
- else
2567
- r12 = instantiate_node(SyntaxNode,input, index...index)
2568
- end
2569
- s11 << r12
2570
- if r12
2571
- r16 = _nt_class_name
2572
- s11 << r16
2573
- end
2574
- if s11.last
2575
- r11 = instantiate_node(NodeAsValue,input, i11...index, s11)
2576
- r11.extend(Value1)
2577
- else
2578
- @index = i11
2579
- r11 = nil
2580
- end
2543
+ r11 = _nt_hash_expr
2581
2544
  if r11
2582
2545
  r11 = SyntaxNode.new(input, (index-1)...index) if r11 == true
2583
2546
  r0 = r11
2584
2547
  else
2585
- i17, s17 = index, []
2586
- if (match_len = has_terminal?('(', false, index))
2587
- r18 = true
2588
- @index += match_len
2548
+ 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
2574
+ s12 << r13
2575
+ if r13
2576
+ r17 = _nt_class_name
2577
+ s12 << r17
2578
+ end
2579
+ if s12.last
2580
+ r12 = instantiate_node(NodeAsValue,input, i12...index, s12)
2581
+ r12.extend(Value1)
2589
2582
  else
2590
- terminal_parse_failure('\'(\'')
2591
- r18 = nil
2583
+ @index = i12
2584
+ r12 = nil
2592
2585
  end
2593
- s17 << r18
2594
- if r18
2595
- r20 = _nt_sp
2596
- if r20
2597
- r19 = r20
2586
+ if r12
2587
+ r12 = SyntaxNode.new(input, (index-1)...index) if r12 == true
2588
+ r0 = r12
2589
+ else
2590
+ i18, s18 = index, []
2591
+ if (match_len = has_terminal?('(', false, index))
2592
+ r19 = true
2593
+ @index += match_len
2598
2594
  else
2599
- r19 = instantiate_node(SyntaxNode,input, index...index)
2595
+ terminal_parse_failure('\'(\'')
2596
+ r19 = nil
2600
2597
  end
2601
- s17 << r19
2598
+ s18 << r19
2602
2599
  if r19
2603
- r21 = _nt_expression
2604
- s17 << r21
2600
+ r21 = _nt_sp
2605
2601
  if r21
2606
- r23 = _nt_sp
2607
- if r23
2608
- r22 = r23
2609
- else
2610
- r22 = instantiate_node(SyntaxNode,input, index...index)
2611
- end
2612
- s17 << r22
2602
+ r20 = r21
2603
+ else
2604
+ r20 = instantiate_node(SyntaxNode,input, index...index)
2605
+ end
2606
+ s18 << r20
2607
+ if r20
2608
+ r22 = _nt_expression
2609
+ s18 << r22
2613
2610
  if r22
2614
- if (match_len = has_terminal?(')', false, index))
2615
- r24 = true
2616
- @index += match_len
2611
+ r24 = _nt_sp
2612
+ if r24
2613
+ r23 = r24
2617
2614
  else
2618
- terminal_parse_failure('\')\'')
2619
- r24 = nil
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
2622
+ else
2623
+ terminal_parse_failure('\')\'')
2624
+ r25 = nil
2625
+ end
2626
+ s18 << r25
2620
2627
  end
2621
- s17 << r24
2622
2628
  end
2623
2629
  end
2624
2630
  end
2625
- end
2626
- if s17.last
2627
- r17 = instantiate_node(Expr,input, i17...index, s17)
2628
- r17.extend(Value2)
2629
- else
2630
- @index = i17
2631
- r17 = nil
2632
- end
2633
- if r17
2634
- r17 = SyntaxNode.new(input, (index-1)...index) if r17 == true
2635
- r0 = r17
2636
- else
2637
- @index = i0
2638
- r0 = nil
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
2644
+ end
2639
2645
  end
2640
2646
  end
2641
2647
  end
@@ -3739,6 +3745,30 @@ module Delorean
3739
3745
  r0
3740
3746
  end
3741
3747
 
3748
+ def _nt_sup
3749
+ start_index = index
3750
+ if node_cache[:sup].has_key?(index)
3751
+ cached = node_cache[:sup][index]
3752
+ if cached
3753
+ node_cache[:sup][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
3754
+ @index = cached.interval.end
3755
+ end
3756
+ return cached
3757
+ end
3758
+
3759
+ if (match_len = has_terminal?('_sup', false, index))
3760
+ r0 = instantiate_node(Sup,input, index...(index + match_len))
3761
+ @index += match_len
3762
+ else
3763
+ terminal_parse_failure('\'_sup\'')
3764
+ r0 = nil
3765
+ end
3766
+
3767
+ node_cache[:sup][start_index] = r0
3768
+
3769
+ r0
3770
+ end
3771
+
3742
3772
  def _nt_self
3743
3773
  start_index = index
3744
3774
  if node_cache[:self].has_key?(index)
@@ -114,6 +114,7 @@ grammar Delorean
114
114
  boolean /
115
115
  nil_val /
116
116
  identifier /
117
+ sup /
117
118
  self /
118
119
  list_expr /
119
120
  set_expr /
@@ -162,6 +163,10 @@ grammar Delorean
162
163
  'true' <Literal> / 'false' <Literal>
163
164
  end
164
165
 
166
+ rule sup
167
+ '_sup' <Sup>
168
+ end
169
+
165
170
  rule self
166
171
  '_' <Self>
167
172
  end
@@ -238,6 +238,16 @@ eos
238
238
  end
239
239
  end
240
240
 
241
+ class Sup < SNode
242
+ def check(context, *)
243
+ []
244
+ end
245
+
246
+ def rewrite(context)
247
+ "superclass"
248
+ end
249
+ end
250
+
241
251
  class IString < Literal
242
252
  def rewrite(context)
243
253
  # FIXME: hacky to just fail
@@ -1,3 +1,3 @@
1
1
  module Delorean
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end
data/spec/cache_spec.rb CHANGED
@@ -53,8 +53,10 @@ describe "Delorean cache" do
53
53
  )
54
54
  expect(item_2).to eq(nil)
55
55
 
56
- item_10, item_10_found = ::Delorean::Cache.adapter.fetch_item(
57
- klass: Dummy, cache_key: [:returns_cached_openstruct, 10, 10], default: :NF
56
+ item_10 = ::Delorean::Cache.adapter.fetch_item(
57
+ klass: Dummy,
58
+ cache_key: [:returns_cached_openstruct, 10, 10],
59
+ default: :NF
58
60
  )
59
61
 
60
62
  expect(item_10).to be_a(OpenStruct)
data/spec/eval_spec.rb CHANGED
@@ -1071,4 +1071,22 @@ eof
1071
1071
  r2 = engine.evaluate("B", "res2")
1072
1072
  expect(r2.values.uniq.length).to eq 1
1073
1073
  end
1074
+
1075
+ it "Implements ability to use overridden superclass attrs" do
1076
+ code = <<-DELOREAN
1077
+ A:
1078
+ x = 123
1079
+ y = x*2
1080
+ B: A
1081
+ x = 5
1082
+ y = _sup.y * 10
1083
+ xx = _sup.x + 5
1084
+ yy = _sup.x * 10
1085
+ DELOREAN
1086
+
1087
+ engine.parse code.gsub(/^ /, '')
1088
+
1089
+ r = engine.evaluate("B", ["x", "y", "xx", "yy"])
1090
+ expect(r).to eq [5, 2460, 128, 1230]
1091
+ end
1074
1092
  end
@@ -63,7 +63,7 @@ describe "Delorean Ruby whitelisting" do
63
63
  expect do
64
64
  matcher_with_args.match!(klass: Dummy, args: [1, 2])
65
65
  end.to raise_error(
66
- 'bad arg 1, method testmethod_with_args: 2/Fixnum [String, nil]'
66
+ "bad arg 1, method testmethod_with_args: 2/#{2.class} [String, nil]"
67
67
  )
68
68
  end
69
69
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delorean_lang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arman Bostani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-15 00:00:00.000000000 Z
11
+ date: 2019-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: treetop
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: A "compiler" for the Delorean programming language
84
98
  email:
85
99
  - arman.bostani@pnmac.com
@@ -88,8 +102,10 @@ extensions: []
88
102
  extra_rdoc_files: []
89
103
  files:
90
104
  - ".gitignore"
105
+ - ".gitlab-ci.yml"
91
106
  - ".rspec"
92
107
  - ".rubocop.yml"
108
+ - ".rubocop_todo.yml"
93
109
  - Gemfile
94
110
  - LICENSE
95
111
  - README.md