delorean_lang 1.0.0 → 1.1.0

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.
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)