delorean_lang 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3da8ff66652a79d2c5e7b38c57f35ba6821e3140
4
- data.tar.gz: 6c6095ab7aeca95707b88f1966210085ac5a4a5a
2
+ SHA256:
3
+ metadata.gz: 9255b38f00277f412eb2a42699d03646470199d261d6cc66298e9e55aa8bd7c0
4
+ data.tar.gz: 3ae838764cd7a0f7355d1586b60112b1e073feb367d4b513a239a495b63940ca
5
5
  SHA512:
6
- metadata.gz: 3ca7618ab74138cf05b64caaaef1e726acbcfa60d98fdb0bd85a4ff5c3033571acca3314568fcb906f4708c877c65b97bd4ade67b6a3a507943df2bc3a03cab7
7
- data.tar.gz: ec8046cb9e85260ab4d6c44a09e853556e906d30e70ca86a48c2f522786bfe776f1176f12c829f7407f8da6c1bcf7d1e6acbb8b3c614ff1242da734f8aca32d8
6
+ metadata.gz: 3d05eb327cd542977ff5eb795cb57326bd2daed68b6d599e62365adf6a0d828df2bcc7514095605a9318ce281d7dcf6bfb636b1dbdae6055708b2cb4c32835ff
7
+ data.tar.gz: b315ab0405e667e6484b2a109b435f0a53a403fec92baa41d483be8b1978477002a82930d8457c1819c076f37f009494c80c313867cabed1af2f3e307c10f65a
@@ -25,6 +25,7 @@ Metrics/ModuleLength:
25
25
  - 'spec/**/*'
26
26
 
27
27
  Metrics/BlockLength:
28
+ Max: 40
28
29
  Exclude:
29
30
  - 'spec/**/*'
30
31
 
@@ -37,7 +37,7 @@ Lint/Void:
37
37
 
38
38
  # Offense count: 19
39
39
  Metrics/AbcSize:
40
- Max: 150
40
+ Max: 250
41
41
 
42
42
  # Offense count: 2
43
43
  # Configuration parameters: CountComments.
@@ -46,16 +46,16 @@ Metrics/ClassLength:
46
46
 
47
47
  # Offense count: 6
48
48
  Metrics/CyclomaticComplexity:
49
- Max: 11
49
+ Max: 15
50
50
 
51
51
  # Offense count: 16
52
52
  # Configuration parameters: CountComments, ExcludedMethods.
53
53
  Metrics/MethodLength:
54
- Max: 219
54
+ Max: 300
55
55
 
56
56
  # Offense count: 4
57
57
  Metrics/PerceivedComplexity:
58
- Max: 13
58
+ Max: 15
59
59
 
60
60
  # Offense count: 1
61
61
  Naming/AccessorMethodName:
@@ -0,0 +1,2 @@
1
+ treetop-generate:
2
+ rm lib/delorean/delorean.rb && tt lib/delorean/delorean.treetop
data/README.md CHANGED
@@ -163,6 +163,10 @@ There are two ways of calling ruby code from delorean. First one is to whitelist
163
163
 
164
164
  ```ruby
165
165
 
166
+ ::Delorean::Ruby.whitelist.add__method :any? do |method|
167
+ method.called_on Enumerable
168
+ end
169
+
166
170
  ::Delorean::Ruby.whitelist.add_method :length do |method|
167
171
  method.called_on String
168
172
  method.called_on Enumerable
@@ -221,6 +225,24 @@ ExampleScript:
221
225
  b = DummyModule.heres_my_number(867, 5309)'
222
226
  ```
223
227
 
228
+ You can use blocks in your Delorean code:
229
+
230
+ ```ruby
231
+ ExampleScript:
232
+ a = [1, 2, 3]
233
+ b = c.any? { |v| v > 2 }
234
+ b2 = c.any? do |v| v > 2 end
235
+
236
+ c = a.reduce(0) { |sum, el|
237
+ sum + el
238
+ }
239
+ c2 = a.reduce() do |sum, el|
240
+ sum + el
241
+ end
242
+ ```
243
+
244
+ Note that `do ... end` syntax is not yet supported
245
+
224
246
  ### Caching
225
247
 
226
248
  Delorean provides `cache` flag for `delorean_fn` method that will cache result based on arguments.
@@ -268,6 +290,18 @@ Delorean expects it to have methods with following signatures:
268
290
 
269
291
  TODO: provide details
270
292
 
293
+ ## Development
294
+
295
+ ### Treetop
296
+
297
+ Edit treetop rules in `lib/delorean/delorean.treetop`
298
+
299
+ Use `make treetop-generate` to regenerate `lib/delorean/delorean.rb` based on Treetop logic in `lib/delorean/delorean.treetop`
300
+
301
+ ### Testing
302
+
303
+ Use `rspec` to run the tests.
304
+
271
305
  ## License
272
306
 
273
307
  Delorean has been released under the MIT license. Please check the
@@ -173,7 +173,7 @@ module Delorean
173
173
 
174
174
  ######################################################################
175
175
 
176
- def self._instance_call(obj, method, args, _e)
176
+ def self._instance_call(obj, method, args, _e, &block)
177
177
  begin
178
178
  msg = method.to_sym
179
179
  rescue NoMethodError
@@ -193,14 +193,22 @@ module Delorean
193
193
  raise "no such method #{method}" unless matcher
194
194
 
195
195
  if matcher.match_to?
196
- return(
197
- _instance_call(obj, matcher.match_to, args, _e)
198
- )
196
+ if block
197
+ return(
198
+ _instance_call(obj, matcher.match_to, args, _e, &block)
199
+ )
200
+ else
201
+ return(
202
+ _instance_call(obj, matcher.match_to, args, _e)
203
+ )
204
+ end
199
205
  end
200
206
 
201
207
  matcher.match!(klass: klass, args: args)
202
208
 
203
- obj.public_send(msg, *args)
209
+ return obj.public_send(msg, *args) unless block
210
+
211
+ obj.public_send(msg, *args, &block)
204
212
  end
205
213
 
206
214
  ######################################################################
@@ -1103,6 +1103,268 @@ module Delorean
1103
1103
  r0
1104
1104
  end
1105
1105
 
1106
+ module BlockArgs0
1107
+ def sp41
1108
+ elements[0]
1109
+ end
1110
+
1111
+ def sp42
1112
+ elements[1]
1113
+ end
1114
+
1115
+ def i
1116
+ elements[3]
1117
+ end
1118
+
1119
+ def e
1120
+ elements[7]
1121
+ end
1122
+ end
1123
+
1124
+ module BlockArgs1
1125
+ def sp41
1126
+ elements[0]
1127
+ end
1128
+
1129
+ def sp42
1130
+ elements[1]
1131
+ end
1132
+
1133
+ def i
1134
+ elements[3]
1135
+ end
1136
+
1137
+ end
1138
+
1139
+ def _nt_block_args
1140
+ start_index = index
1141
+ if node_cache[:block_args].has_key?(index)
1142
+ cached = node_cache[:block_args][index]
1143
+ if cached
1144
+ node_cache[:block_args][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1145
+ @index = cached.interval.end
1146
+ end
1147
+ return cached
1148
+ end
1149
+
1150
+ i0 = index
1151
+ i1, s1 = index, []
1152
+ r2 = _nt_sp4
1153
+ s1 << r2
1154
+ if r2
1155
+ r3 = _nt_sp4
1156
+ s1 << r3
1157
+ if r3
1158
+ r5 = _nt_sp
1159
+ if r5
1160
+ r4 = r5
1161
+ else
1162
+ r4 = instantiate_node(SyntaxNode,input, index...index)
1163
+ end
1164
+ s1 << r4
1165
+ if r4
1166
+ r6 = _nt_identifier
1167
+ s1 << r6
1168
+ if r6
1169
+ r8 = _nt_sp
1170
+ if r8
1171
+ r7 = r8
1172
+ else
1173
+ r7 = instantiate_node(SyntaxNode,input, index...index)
1174
+ end
1175
+ s1 << r7
1176
+ if r7
1177
+ if (match_len = has_terminal?('=?', false, index))
1178
+ r9 = instantiate_node(SyntaxNode,input, index...(index + match_len))
1179
+ @index += match_len
1180
+ else
1181
+ terminal_parse_failure('\'=?\'')
1182
+ r9 = nil
1183
+ end
1184
+ s1 << r9
1185
+ if r9
1186
+ r11 = _nt_sp1
1187
+ if r11
1188
+ r10 = r11
1189
+ else
1190
+ r10 = instantiate_node(SyntaxNode,input, index...index)
1191
+ end
1192
+ s1 << r10
1193
+ if r10
1194
+ r12 = _nt_expression
1195
+ s1 << r12
1196
+ end
1197
+ end
1198
+ end
1199
+ end
1200
+ end
1201
+ end
1202
+ end
1203
+ if s1.last
1204
+ r1 = instantiate_node(BlockParameterDefault,input, i1...index, s1)
1205
+ r1.extend(BlockArgs0)
1206
+ else
1207
+ @index = i1
1208
+ r1 = nil
1209
+ end
1210
+ if r1
1211
+ r1 = SyntaxNode.new(input, (index-1)...index) if r1 == true
1212
+ r0 = r1
1213
+ else
1214
+ i13, s13 = index, []
1215
+ r14 = _nt_sp4
1216
+ s13 << r14
1217
+ if r14
1218
+ r15 = _nt_sp4
1219
+ s13 << r15
1220
+ if r15
1221
+ r17 = _nt_sp
1222
+ if r17
1223
+ r16 = r17
1224
+ else
1225
+ r16 = instantiate_node(SyntaxNode,input, index...index)
1226
+ end
1227
+ s13 << r16
1228
+ if r16
1229
+ r18 = _nt_identifier
1230
+ s13 << r18
1231
+ if r18
1232
+ r20 = _nt_sp
1233
+ if r20
1234
+ r19 = r20
1235
+ else
1236
+ r19 = instantiate_node(SyntaxNode,input, index...index)
1237
+ end
1238
+ s13 << r19
1239
+ if r19
1240
+ if (match_len = has_terminal?('=?', false, index))
1241
+ r21 = instantiate_node(SyntaxNode,input, index...(index + match_len))
1242
+ @index += match_len
1243
+ else
1244
+ terminal_parse_failure('\'=?\'')
1245
+ r21 = nil
1246
+ end
1247
+ s13 << r21
1248
+ end
1249
+ end
1250
+ end
1251
+ end
1252
+ end
1253
+ if s13.last
1254
+ r13 = instantiate_node(BlockParameter,input, i13...index, s13)
1255
+ r13.extend(BlockArgs1)
1256
+ else
1257
+ @index = i13
1258
+ r13 = nil
1259
+ end
1260
+ if r13
1261
+ r13 = SyntaxNode.new(input, (index-1)...index) if r13 == true
1262
+ r0 = r13
1263
+ else
1264
+ @index = i0
1265
+ r0 = nil
1266
+ end
1267
+ end
1268
+
1269
+ node_cache[:block_args][start_index] = r0
1270
+
1271
+ r0
1272
+ end
1273
+
1274
+ module BlockFormulas0
1275
+ def sp41
1276
+ elements[0]
1277
+ end
1278
+
1279
+ def sp42
1280
+ elements[1]
1281
+ end
1282
+
1283
+ def i
1284
+ elements[3]
1285
+ end
1286
+
1287
+ def e
1288
+ elements[7]
1289
+ end
1290
+ end
1291
+
1292
+ def _nt_block_formulas
1293
+ start_index = index
1294
+ if node_cache[:block_formulas].has_key?(index)
1295
+ cached = node_cache[:block_formulas][index]
1296
+ if cached
1297
+ node_cache[:block_formulas][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1298
+ @index = cached.interval.end
1299
+ end
1300
+ return cached
1301
+ end
1302
+
1303
+ i0, s0 = index, []
1304
+ r1 = _nt_sp4
1305
+ s0 << r1
1306
+ if r1
1307
+ r2 = _nt_sp4
1308
+ s0 << r2
1309
+ if r2
1310
+ r4 = _nt_sp
1311
+ if r4
1312
+ r3 = r4
1313
+ else
1314
+ r3 = instantiate_node(SyntaxNode,input, index...index)
1315
+ end
1316
+ s0 << r3
1317
+ if r3
1318
+ r5 = _nt_identifier
1319
+ s0 << r5
1320
+ if r5
1321
+ r7 = _nt_sp
1322
+ if r7
1323
+ r6 = r7
1324
+ else
1325
+ r6 = instantiate_node(SyntaxNode,input, index...index)
1326
+ end
1327
+ s0 << r6
1328
+ if r6
1329
+ if (match_len = has_terminal?('=', false, index))
1330
+ r8 = true
1331
+ @index += match_len
1332
+ else
1333
+ terminal_parse_failure('\'=\'')
1334
+ r8 = nil
1335
+ end
1336
+ s0 << r8
1337
+ if r8
1338
+ r10 = _nt_sp
1339
+ if r10
1340
+ r9 = r10
1341
+ else
1342
+ r9 = instantiate_node(SyntaxNode,input, index...index)
1343
+ end
1344
+ s0 << r9
1345
+ if r9
1346
+ r11 = _nt_expression
1347
+ s0 << r11
1348
+ end
1349
+ end
1350
+ end
1351
+ end
1352
+ end
1353
+ end
1354
+ end
1355
+ if s0.last
1356
+ r0 = instantiate_node(BlockFormula,input, i0...index, s0)
1357
+ r0.extend(BlockFormulas0)
1358
+ else
1359
+ @index = i0
1360
+ r0 = nil
1361
+ end
1362
+
1363
+ node_cache[:block_formulas][start_index] = r0
1364
+
1365
+ r0
1366
+ end
1367
+
1106
1368
  module GetattrExp0
1107
1369
  def v
1108
1370
  elements[0]
@@ -1227,12 +1489,44 @@ module Delorean
1227
1489
  elements[5]
1228
1490
  end
1229
1491
 
1492
+ def b_args
1493
+ elements[8]
1494
+ end
1495
+
1496
+ def expressions
1497
+ elements[9]
1498
+ end
1230
1499
  end
1231
1500
 
1232
1501
  module DotExp3
1233
1502
  def i
1234
1503
  elements[2]
1235
1504
  end
1505
+
1506
+ def al
1507
+ elements[5]
1508
+ end
1509
+
1510
+ end
1511
+
1512
+ module DotExp4
1513
+ def i
1514
+ elements[2]
1515
+ end
1516
+
1517
+ def b_args
1518
+ elements[3]
1519
+ end
1520
+
1521
+ def expressions
1522
+ elements[4]
1523
+ end
1524
+ end
1525
+
1526
+ module DotExp5
1527
+ def i
1528
+ elements[2]
1529
+ end
1236
1530
  end
1237
1531
 
1238
1532
  def _nt_dot_exp
@@ -1418,6 +1712,37 @@ module Delorean
1418
1712
  r30 = nil
1419
1713
  end
1420
1714
  s18 << r30
1715
+ if r30
1716
+ s31, i31 = [], index
1717
+ loop do
1718
+ r32 = _nt_block_args
1719
+ if r32
1720
+ s31 << r32
1721
+ else
1722
+ break
1723
+ end
1724
+ end
1725
+ r31 = instantiate_node(SyntaxNode,input, i31...index, s31)
1726
+ s18 << r31
1727
+ if r31
1728
+ s33, i33 = [], index
1729
+ loop do
1730
+ r34 = _nt_block_formulas
1731
+ if r34
1732
+ s33 << r34
1733
+ else
1734
+ break
1735
+ end
1736
+ end
1737
+ if s33.empty?
1738
+ @index = i33
1739
+ r33 = nil
1740
+ else
1741
+ r33 = instantiate_node(SyntaxNode,input, i33...index, s33)
1742
+ end
1743
+ s18 << r33
1744
+ end
1745
+ end
1421
1746
  end
1422
1747
  end
1423
1748
  end
@@ -1426,7 +1751,7 @@ module Delorean
1426
1751
  end
1427
1752
  end
1428
1753
  if s18.last
1429
- r18 = instantiate_node(Call,input, i18...index, s18)
1754
+ r18 = instantiate_node(BlockExpression,input, i18...index, s18)
1430
1755
  r18.extend(DotExp2)
1431
1756
  else
1432
1757
  @index = i18
@@ -1436,55 +1761,201 @@ module Delorean
1436
1761
  r18 = SyntaxNode.new(input, (index-1)...index) if r18 == true
1437
1762
  r0 = r18
1438
1763
  else
1439
- i31, s31 = index, []
1764
+ i35, s35 = index, []
1440
1765
  if (match_len = has_terminal?('.', false, index))
1441
- r32 = true
1766
+ r36 = true
1442
1767
  @index += match_len
1443
1768
  else
1444
1769
  terminal_parse_failure('\'.\'')
1445
- r32 = nil
1770
+ r36 = nil
1446
1771
  end
1447
- s31 << r32
1448
- if r32
1449
- r34 = _nt_sp
1450
- if r34
1451
- r33 = r34
1772
+ s35 << r36
1773
+ if r36
1774
+ r38 = _nt_sp
1775
+ if r38
1776
+ r37 = r38
1452
1777
  else
1453
- r33 = instantiate_node(SyntaxNode,input, index...index)
1778
+ r37 = instantiate_node(SyntaxNode,input, index...index)
1454
1779
  end
1455
- s31 << r33
1456
- if r33
1457
- i35 = index
1458
- r36 = _nt_identifier
1459
- if r36
1460
- r36 = SyntaxNode.new(input, (index-1)...index) if r36 == true
1461
- r35 = r36
1462
- else
1463
- r37 = _nt_integer
1464
- if r37
1465
- r37 = SyntaxNode.new(input, (index-1)...index) if r37 == true
1466
- r35 = r37
1780
+ s35 << r37
1781
+ if r37
1782
+ r39 = _nt_identifier
1783
+ s35 << r39
1784
+ if r39
1785
+ if (match_len = has_terminal?('(', false, index))
1786
+ r40 = true
1787
+ @index += match_len
1467
1788
  else
1468
- @index = i35
1469
- r35 = nil
1789
+ terminal_parse_failure('\'(\'')
1790
+ r40 = nil
1791
+ end
1792
+ s35 << r40
1793
+ if r40
1794
+ r42 = _nt_sp
1795
+ if r42
1796
+ r41 = r42
1797
+ else
1798
+ r41 = instantiate_node(SyntaxNode,input, index...index)
1799
+ end
1800
+ s35 << r41
1801
+ if r41
1802
+ r44 = _nt_fn_args
1803
+ if r44
1804
+ r43 = r44
1805
+ else
1806
+ r43 = instantiate_node(SyntaxNode,input, index...index)
1807
+ end
1808
+ s35 << r43
1809
+ if r43
1810
+ r46 = _nt_sp
1811
+ if r46
1812
+ r45 = r46
1813
+ else
1814
+ r45 = instantiate_node(SyntaxNode,input, index...index)
1815
+ end
1816
+ s35 << r45
1817
+ if r45
1818
+ if (match_len = has_terminal?(')', false, index))
1819
+ r47 = true
1820
+ @index += match_len
1821
+ else
1822
+ terminal_parse_failure('\')\'')
1823
+ r47 = nil
1824
+ end
1825
+ s35 << r47
1826
+ end
1827
+ end
1828
+ end
1470
1829
  end
1471
1830
  end
1472
- s31 << r35
1473
1831
  end
1474
1832
  end
1475
- if s31.last
1476
- r31 = instantiate_node(GetAttr,input, i31...index, s31)
1477
- r31.extend(DotExp3)
1833
+ if s35.last
1834
+ r35 = instantiate_node(Call,input, i35...index, s35)
1835
+ r35.extend(DotExp3)
1478
1836
  else
1479
- @index = i31
1480
- r31 = nil
1837
+ @index = i35
1838
+ r35 = nil
1481
1839
  end
1482
- if r31
1483
- r31 = SyntaxNode.new(input, (index-1)...index) if r31 == true
1484
- r0 = r31
1840
+ if r35
1841
+ r35 = SyntaxNode.new(input, (index-1)...index) if r35 == true
1842
+ r0 = r35
1485
1843
  else
1486
- @index = i0
1487
- r0 = nil
1844
+ i48, s48 = index, []
1845
+ if (match_len = has_terminal?('.', false, index))
1846
+ r49 = true
1847
+ @index += match_len
1848
+ else
1849
+ terminal_parse_failure('\'.\'')
1850
+ r49 = nil
1851
+ end
1852
+ s48 << r49
1853
+ if r49
1854
+ r51 = _nt_sp
1855
+ if r51
1856
+ r50 = r51
1857
+ else
1858
+ r50 = instantiate_node(SyntaxNode,input, index...index)
1859
+ end
1860
+ s48 << r50
1861
+ if r50
1862
+ r52 = _nt_identifier
1863
+ s48 << r52
1864
+ if r52
1865
+ s53, i53 = [], index
1866
+ loop do
1867
+ r54 = _nt_block_args
1868
+ if r54
1869
+ s53 << r54
1870
+ else
1871
+ break
1872
+ end
1873
+ end
1874
+ r53 = instantiate_node(SyntaxNode,input, i53...index, s53)
1875
+ s48 << r53
1876
+ if r53
1877
+ s55, i55 = [], index
1878
+ loop do
1879
+ r56 = _nt_block_formulas
1880
+ if r56
1881
+ s55 << r56
1882
+ else
1883
+ break
1884
+ end
1885
+ end
1886
+ if s55.empty?
1887
+ @index = i55
1888
+ r55 = nil
1889
+ else
1890
+ r55 = instantiate_node(SyntaxNode,input, i55...index, s55)
1891
+ end
1892
+ s48 << r55
1893
+ end
1894
+ end
1895
+ end
1896
+ end
1897
+ if s48.last
1898
+ r48 = instantiate_node(BlockExpression,input, i48...index, s48)
1899
+ r48.extend(DotExp4)
1900
+ else
1901
+ @index = i48
1902
+ r48 = nil
1903
+ end
1904
+ if r48
1905
+ r48 = SyntaxNode.new(input, (index-1)...index) if r48 == true
1906
+ r0 = r48
1907
+ else
1908
+ i57, s57 = index, []
1909
+ if (match_len = has_terminal?('.', false, index))
1910
+ r58 = true
1911
+ @index += match_len
1912
+ else
1913
+ terminal_parse_failure('\'.\'')
1914
+ r58 = nil
1915
+ end
1916
+ s57 << r58
1917
+ if r58
1918
+ r60 = _nt_sp
1919
+ if r60
1920
+ r59 = r60
1921
+ else
1922
+ r59 = instantiate_node(SyntaxNode,input, index...index)
1923
+ end
1924
+ s57 << r59
1925
+ if r59
1926
+ i61 = index
1927
+ r62 = _nt_identifier
1928
+ if r62
1929
+ r62 = SyntaxNode.new(input, (index-1)...index) if r62 == true
1930
+ r61 = r62
1931
+ else
1932
+ r63 = _nt_integer
1933
+ if r63
1934
+ r63 = SyntaxNode.new(input, (index-1)...index) if r63 == true
1935
+ r61 = r63
1936
+ else
1937
+ @index = i61
1938
+ r61 = nil
1939
+ end
1940
+ end
1941
+ s57 << r61
1942
+ end
1943
+ end
1944
+ if s57.last
1945
+ r57 = instantiate_node(GetAttr,input, i57...index, s57)
1946
+ r57.extend(DotExp5)
1947
+ else
1948
+ @index = i57
1949
+ r57 = nil
1950
+ end
1951
+ if r57
1952
+ r57 = SyntaxNode.new(input, (index-1)...index) if r57 == true
1953
+ r0 = r57
1954
+ else
1955
+ @index = i0
1956
+ r0 = nil
1957
+ end
1958
+ end
1488
1959
  end
1489
1960
  end
1490
1961
  end
@@ -4006,6 +4477,21 @@ module Delorean
4006
4477
  end
4007
4478
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
4008
4479
  s0 << r2
4480
+ if r2
4481
+ if (match_len = has_terminal?('?', false, index))
4482
+ r5 = true
4483
+ @index += match_len
4484
+ else
4485
+ terminal_parse_failure('\'?\'')
4486
+ r5 = nil
4487
+ end
4488
+ if r5
4489
+ r4 = r5
4490
+ else
4491
+ r4 = instantiate_node(SyntaxNode,input, index...index)
4492
+ end
4493
+ s0 << r4
4494
+ end
4009
4495
  end
4010
4496
  if s0.last
4011
4497
  r0 = instantiate_node(Identifier,input, i0...index, s0)
@@ -4160,6 +4646,30 @@ module Delorean
4160
4646
  r0
4161
4647
  end
4162
4648
 
4649
+ def _nt_sp1
4650
+ start_index = index
4651
+ if node_cache[:sp1].has_key?(index)
4652
+ cached = node_cache[:sp1][index]
4653
+ if cached
4654
+ node_cache[:sp1][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
4655
+ @index = cached.interval.end
4656
+ end
4657
+ return cached
4658
+ end
4659
+
4660
+ if (match_len = has_terminal?(' ', false, index))
4661
+ r0 = instantiate_node(SyntaxNode,input, index...(index + match_len))
4662
+ @index += match_len
4663
+ else
4664
+ terminal_parse_failure('\' \'')
4665
+ r0 = nil
4666
+ end
4667
+
4668
+ node_cache[:sp1][start_index] = r0
4669
+
4670
+ r0
4671
+ end
4672
+
4163
4673
  def _nt_sp
4164
4674
  start_index = index
4165
4675
  if node_cache[:sp].has_key?(index)