delorean_lang 0.1.02 → 0.1.03

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.
@@ -114,10 +114,8 @@ module Delorean
114
114
 
115
115
  def self._node_call(node, mname, _e, params)
116
116
  context = _e[:_engine]
117
- node ||= self
118
-
119
117
  engine = mname ? context.get_import_engine(mname) : context
120
- NodeCall.new(engine, node, params)
118
+ NodeCall.new(engine, node || self, params)
121
119
  end
122
120
 
123
121
  ######################################################################
@@ -1448,6 +1448,279 @@ module Delorean
1448
1448
  r0
1449
1449
  end
1450
1450
 
1451
+ module SetExpr0
1452
+ def sp
1453
+ elements[1]
1454
+ end
1455
+
1456
+ def e3
1457
+ elements[2]
1458
+ end
1459
+
1460
+ end
1461
+
1462
+ module SetExpr1
1463
+ def e2
1464
+ elements[2]
1465
+ end
1466
+
1467
+ def sp1
1468
+ elements[3]
1469
+ end
1470
+
1471
+ def sp2
1472
+ elements[5]
1473
+ end
1474
+
1475
+ def i
1476
+ elements[6]
1477
+ end
1478
+
1479
+ def sp3
1480
+ elements[7]
1481
+ end
1482
+
1483
+ def sp4
1484
+ elements[9]
1485
+ end
1486
+
1487
+ def e1
1488
+ elements[10]
1489
+ end
1490
+
1491
+ def ifexp
1492
+ elements[12]
1493
+ end
1494
+
1495
+ end
1496
+
1497
+ module SetExpr2
1498
+ def args
1499
+ elements[2]
1500
+ end
1501
+
1502
+ end
1503
+
1504
+ def _nt_set_expr
1505
+ start_index = index
1506
+ if node_cache[:set_expr].has_key?(index)
1507
+ cached = node_cache[:set_expr][index]
1508
+ if cached
1509
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1510
+ @index = cached.interval.end
1511
+ end
1512
+ return cached
1513
+ end
1514
+
1515
+ i0 = index
1516
+ if has_terminal?('{-}', false, index)
1517
+ r1 = instantiate_node(SetExpr,input, index...(index + 3))
1518
+ @index += 3
1519
+ else
1520
+ terminal_parse_failure('{-}')
1521
+ r1 = nil
1522
+ end
1523
+ if r1
1524
+ r0 = r1
1525
+ else
1526
+ i2, s2 = index, []
1527
+ if has_terminal?('{', false, index)
1528
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
1529
+ @index += 1
1530
+ else
1531
+ terminal_parse_failure('{')
1532
+ r3 = nil
1533
+ end
1534
+ s2 << r3
1535
+ if r3
1536
+ r5 = _nt_sp
1537
+ if r5
1538
+ r4 = r5
1539
+ else
1540
+ r4 = instantiate_node(SyntaxNode,input, index...index)
1541
+ end
1542
+ s2 << r4
1543
+ if r4
1544
+ r6 = _nt_expression
1545
+ s2 << r6
1546
+ if r6
1547
+ r7 = _nt_sp
1548
+ s2 << r7
1549
+ if r7
1550
+ if has_terminal?('for', false, index)
1551
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 3))
1552
+ @index += 3
1553
+ else
1554
+ terminal_parse_failure('for')
1555
+ r8 = nil
1556
+ end
1557
+ s2 << r8
1558
+ if r8
1559
+ r9 = _nt_sp
1560
+ s2 << r9
1561
+ if r9
1562
+ r10 = _nt_identifier
1563
+ s2 << r10
1564
+ if r10
1565
+ r11 = _nt_sp
1566
+ s2 << r11
1567
+ if r11
1568
+ if has_terminal?('in', false, index)
1569
+ r12 = instantiate_node(SyntaxNode,input, index...(index + 2))
1570
+ @index += 2
1571
+ else
1572
+ terminal_parse_failure('in')
1573
+ r12 = nil
1574
+ end
1575
+ s2 << r12
1576
+ if r12
1577
+ r13 = _nt_sp
1578
+ s2 << r13
1579
+ if r13
1580
+ r14 = _nt_expression
1581
+ s2 << r14
1582
+ if r14
1583
+ r16 = _nt_sp
1584
+ if r16
1585
+ r15 = r16
1586
+ else
1587
+ r15 = instantiate_node(SyntaxNode,input, index...index)
1588
+ end
1589
+ s2 << r15
1590
+ if r15
1591
+ i18, s18 = index, []
1592
+ if has_terminal?('if', false, index)
1593
+ r19 = instantiate_node(SyntaxNode,input, index...(index + 2))
1594
+ @index += 2
1595
+ else
1596
+ terminal_parse_failure('if')
1597
+ r19 = nil
1598
+ end
1599
+ s18 << r19
1600
+ if r19
1601
+ r20 = _nt_sp
1602
+ s18 << r20
1603
+ if r20
1604
+ r21 = _nt_expression
1605
+ s18 << r21
1606
+ if r21
1607
+ r23 = _nt_sp
1608
+ if r23
1609
+ r22 = r23
1610
+ else
1611
+ r22 = instantiate_node(SyntaxNode,input, index...index)
1612
+ end
1613
+ s18 << r22
1614
+ end
1615
+ end
1616
+ end
1617
+ if s18.last
1618
+ r18 = instantiate_node(SyntaxNode,input, i18...index, s18)
1619
+ r18.extend(SetExpr0)
1620
+ else
1621
+ @index = i18
1622
+ r18 = nil
1623
+ end
1624
+ if r18
1625
+ r17 = r18
1626
+ else
1627
+ r17 = instantiate_node(SyntaxNode,input, index...index)
1628
+ end
1629
+ s2 << r17
1630
+ if r17
1631
+ if has_terminal?('}', false, index)
1632
+ r24 = instantiate_node(SyntaxNode,input, index...(index + 1))
1633
+ @index += 1
1634
+ else
1635
+ terminal_parse_failure('}')
1636
+ r24 = nil
1637
+ end
1638
+ s2 << r24
1639
+ end
1640
+ end
1641
+ end
1642
+ end
1643
+ end
1644
+ end
1645
+ end
1646
+ end
1647
+ end
1648
+ end
1649
+ end
1650
+ end
1651
+ end
1652
+ if s2.last
1653
+ r2 = instantiate_node(SetComprehension,input, i2...index, s2)
1654
+ r2.extend(SetExpr1)
1655
+ else
1656
+ @index = i2
1657
+ r2 = nil
1658
+ end
1659
+ if r2
1660
+ r0 = r2
1661
+ else
1662
+ i25, s25 = index, []
1663
+ if has_terminal?('{', false, index)
1664
+ r26 = instantiate_node(SyntaxNode,input, index...(index + 1))
1665
+ @index += 1
1666
+ else
1667
+ terminal_parse_failure('{')
1668
+ r26 = nil
1669
+ end
1670
+ s25 << r26
1671
+ if r26
1672
+ r28 = _nt_sp
1673
+ if r28
1674
+ r27 = r28
1675
+ else
1676
+ r27 = instantiate_node(SyntaxNode,input, index...index)
1677
+ end
1678
+ s25 << r27
1679
+ if r27
1680
+ r29 = _nt_fn_args
1681
+ s25 << r29
1682
+ if r29
1683
+ r31 = _nt_sp
1684
+ if r31
1685
+ r30 = r31
1686
+ else
1687
+ r30 = instantiate_node(SyntaxNode,input, index...index)
1688
+ end
1689
+ s25 << r30
1690
+ if r30
1691
+ if has_terminal?('}', false, index)
1692
+ r32 = instantiate_node(SyntaxNode,input, index...(index + 1))
1693
+ @index += 1
1694
+ else
1695
+ terminal_parse_failure('}')
1696
+ r32 = nil
1697
+ end
1698
+ s25 << r32
1699
+ end
1700
+ end
1701
+ end
1702
+ end
1703
+ if s25.last
1704
+ r25 = instantiate_node(SetExpr,input, i25...index, s25)
1705
+ r25.extend(SetExpr2)
1706
+ else
1707
+ @index = i25
1708
+ r25 = nil
1709
+ end
1710
+ if r25
1711
+ r0 = r25
1712
+ else
1713
+ @index = i0
1714
+ r0 = nil
1715
+ end
1716
+ end
1717
+ end
1718
+
1719
+ node_cache[:set_expr][start_index] = r0
1720
+
1721
+ r0
1722
+ end
1723
+
1451
1724
  module HashExpr0
1452
1725
  def sp
1453
1726
  elements[1]
@@ -1769,138 +2042,171 @@ module Delorean
1769
2042
  end
1770
2043
 
1771
2044
  i0 = index
1772
- if has_terminal?('+', false, index)
1773
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
1774
- @index += 1
2045
+ if has_terminal?('==', false, index)
2046
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
2047
+ @index += 2
1775
2048
  else
1776
- terminal_parse_failure('+')
2049
+ terminal_parse_failure('==')
1777
2050
  r1 = nil
1778
2051
  end
1779
2052
  if r1
1780
2053
  r0 = r1
1781
2054
  else
1782
- if has_terminal?('-', false, index)
1783
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
1784
- @index += 1
2055
+ if has_terminal?('!=', false, index)
2056
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 2))
2057
+ @index += 2
1785
2058
  else
1786
- terminal_parse_failure('-')
2059
+ terminal_parse_failure('!=')
1787
2060
  r2 = nil
1788
2061
  end
1789
2062
  if r2
1790
2063
  r0 = r2
1791
2064
  else
1792
- if has_terminal?('*', false, index)
1793
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
1794
- @index += 1
2065
+ if has_terminal?('>=', false, index)
2066
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 2))
2067
+ @index += 2
1795
2068
  else
1796
- terminal_parse_failure('*')
2069
+ terminal_parse_failure('>=')
1797
2070
  r3 = nil
1798
2071
  end
1799
2072
  if r3
1800
2073
  r0 = r3
1801
2074
  else
1802
- if has_terminal?('/', false, index)
1803
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
1804
- @index += 1
2075
+ if has_terminal?('<=', false, index)
2076
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 2))
2077
+ @index += 2
1805
2078
  else
1806
- terminal_parse_failure('/')
2079
+ terminal_parse_failure('<=')
1807
2080
  r4 = nil
1808
2081
  end
1809
2082
  if r4
1810
2083
  r0 = r4
1811
2084
  else
1812
- if has_terminal?('%', false, index)
1813
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
1814
- @index += 1
2085
+ if has_terminal?('&&', false, index)
2086
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 2))
2087
+ @index += 2
1815
2088
  else
1816
- terminal_parse_failure('%')
2089
+ terminal_parse_failure('&&')
1817
2090
  r5 = nil
1818
2091
  end
1819
2092
  if r5
1820
2093
  r0 = r5
1821
2094
  else
1822
- if has_terminal?('==', false, index)
2095
+ if has_terminal?('||', false, index)
1823
2096
  r6 = instantiate_node(SyntaxNode,input, index...(index + 2))
1824
2097
  @index += 2
1825
2098
  else
1826
- terminal_parse_failure('==')
2099
+ terminal_parse_failure('||')
1827
2100
  r6 = nil
1828
2101
  end
1829
2102
  if r6
1830
2103
  r0 = r6
1831
2104
  else
1832
- if has_terminal?('!=', false, index)
1833
- r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
1834
- @index += 2
2105
+ if has_terminal?('>', false, index)
2106
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
2107
+ @index += 1
1835
2108
  else
1836
- terminal_parse_failure('!=')
2109
+ terminal_parse_failure('>')
1837
2110
  r7 = nil
1838
2111
  end
1839
2112
  if r7
1840
2113
  r0 = r7
1841
2114
  else
1842
- if has_terminal?('>=', false, index)
1843
- r8 = instantiate_node(SyntaxNode,input, index...(index + 2))
1844
- @index += 2
2115
+ if has_terminal?('<', false, index)
2116
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
2117
+ @index += 1
1845
2118
  else
1846
- terminal_parse_failure('>=')
2119
+ terminal_parse_failure('<')
1847
2120
  r8 = nil
1848
2121
  end
1849
2122
  if r8
1850
2123
  r0 = r8
1851
2124
  else
1852
- if has_terminal?('<=', false, index)
1853
- r9 = instantiate_node(SyntaxNode,input, index...(index + 2))
1854
- @index += 2
2125
+ if has_terminal?('+', false, index)
2126
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2127
+ @index += 1
1855
2128
  else
1856
- terminal_parse_failure('<=')
2129
+ terminal_parse_failure('+')
1857
2130
  r9 = nil
1858
2131
  end
1859
2132
  if r9
1860
2133
  r0 = r9
1861
2134
  else
1862
- if has_terminal?('>', false, index)
2135
+ if has_terminal?('-', false, index)
1863
2136
  r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
1864
2137
  @index += 1
1865
2138
  else
1866
- terminal_parse_failure('>')
2139
+ terminal_parse_failure('-')
1867
2140
  r10 = nil
1868
2141
  end
1869
2142
  if r10
1870
2143
  r0 = r10
1871
2144
  else
1872
- if has_terminal?('<', false, index)
2145
+ if has_terminal?('*', false, index)
1873
2146
  r11 = instantiate_node(SyntaxNode,input, index...(index + 1))
1874
2147
  @index += 1
1875
2148
  else
1876
- terminal_parse_failure('<')
2149
+ terminal_parse_failure('*')
1877
2150
  r11 = nil
1878
2151
  end
1879
2152
  if r11
1880
2153
  r0 = r11
1881
2154
  else
1882
- if has_terminal?('&&', false, index)
1883
- r12 = instantiate_node(SyntaxNode,input, index...(index + 2))
1884
- @index += 2
2155
+ if has_terminal?('/', false, index)
2156
+ r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
2157
+ @index += 1
1885
2158
  else
1886
- terminal_parse_failure('&&')
2159
+ terminal_parse_failure('/')
1887
2160
  r12 = nil
1888
2161
  end
1889
2162
  if r12
1890
2163
  r0 = r12
1891
2164
  else
1892
- if has_terminal?('||', false, index)
1893
- r13 = instantiate_node(SyntaxNode,input, index...(index + 2))
1894
- @index += 2
2165
+ if has_terminal?('%', false, index)
2166
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
2167
+ @index += 1
1895
2168
  else
1896
- terminal_parse_failure('||')
2169
+ terminal_parse_failure('%')
1897
2170
  r13 = nil
1898
2171
  end
1899
2172
  if r13
1900
2173
  r0 = r13
1901
2174
  else
1902
- @index = i0
1903
- r0 = nil
2175
+ if has_terminal?('&', false, index)
2176
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
2177
+ @index += 1
2178
+ else
2179
+ terminal_parse_failure('&')
2180
+ r14 = nil
2181
+ end
2182
+ if r14
2183
+ r0 = r14
2184
+ else
2185
+ if has_terminal?('^', false, index)
2186
+ r15 = instantiate_node(SyntaxNode,input, index...(index + 1))
2187
+ @index += 1
2188
+ else
2189
+ terminal_parse_failure('^')
2190
+ r15 = nil
2191
+ end
2192
+ if r15
2193
+ r0 = r15
2194
+ else
2195
+ if has_terminal?('|', false, index)
2196
+ r16 = instantiate_node(SyntaxNode,input, index...(index + 1))
2197
+ @index += 1
2198
+ else
2199
+ terminal_parse_failure('|')
2200
+ r16 = nil
2201
+ end
2202
+ if r16
2203
+ r0 = r16
2204
+ else
2205
+ @index = i0
2206
+ r0 = nil
2207
+ end
2208
+ end
2209
+ end
1904
2210
  end
1905
2211
  end
1906
2212
  end
@@ -2022,104 +2328,109 @@ module Delorean
2022
2328
  if r6
2023
2329
  r0 = r6
2024
2330
  else
2025
- r7 = _nt_hash_expr
2331
+ r7 = _nt_set_expr
2026
2332
  if r7
2027
2333
  r0 = r7
2028
2334
  else
2029
- i8, s8 = index, []
2030
- i10, s10 = index, []
2031
- r11 = _nt_class_name
2032
- s10 << r11
2033
- if r11
2034
- if has_terminal?('::', false, index)
2035
- r12 = instantiate_node(SyntaxNode,input, index...(index + 2))
2036
- @index += 2
2037
- else
2038
- terminal_parse_failure('::')
2039
- r12 = nil
2040
- end
2041
- s10 << r12
2042
- end
2043
- if s10.last
2044
- r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
2045
- r10.extend(Value0)
2046
- else
2047
- @index = i10
2048
- r10 = nil
2049
- end
2050
- if r10
2051
- r9 = r10
2052
- else
2053
- r9 = instantiate_node(SyntaxNode,input, index...index)
2054
- end
2055
- s8 << r9
2056
- if r9
2057
- r13 = _nt_class_name
2058
- s8 << r13
2059
- end
2060
- if s8.last
2061
- r8 = instantiate_node(NodeAsValue,input, i8...index, s8)
2062
- r8.extend(Value1)
2063
- else
2064
- @index = i8
2065
- r8 = nil
2066
- end
2335
+ r8 = _nt_hash_expr
2067
2336
  if r8
2068
2337
  r0 = r8
2069
2338
  else
2070
- i14, s14 = index, []
2071
- if has_terminal?('(', false, index)
2072
- r15 = instantiate_node(SyntaxNode,input, index...(index + 1))
2073
- @index += 1
2339
+ i9, s9 = index, []
2340
+ i11, s11 = index, []
2341
+ r12 = _nt_class_name
2342
+ s11 << r12
2343
+ if r12
2344
+ if has_terminal?('::', false, index)
2345
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 2))
2346
+ @index += 2
2347
+ else
2348
+ terminal_parse_failure('::')
2349
+ r13 = nil
2350
+ end
2351
+ s11 << r13
2352
+ end
2353
+ if s11.last
2354
+ r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
2355
+ r11.extend(Value0)
2356
+ else
2357
+ @index = i11
2358
+ r11 = nil
2359
+ end
2360
+ if r11
2361
+ r10 = r11
2074
2362
  else
2075
- terminal_parse_failure('(')
2076
- r15 = nil
2363
+ r10 = instantiate_node(SyntaxNode,input, index...index)
2364
+ end
2365
+ s9 << r10
2366
+ if r10
2367
+ r14 = _nt_class_name
2368
+ s9 << r14
2369
+ end
2370
+ if s9.last
2371
+ r9 = instantiate_node(NodeAsValue,input, i9...index, s9)
2372
+ r9.extend(Value1)
2373
+ else
2374
+ @index = i9
2375
+ r9 = nil
2077
2376
  end
2078
- s14 << r15
2079
- if r15
2080
- r17 = _nt_sp
2081
- if r17
2082
- r16 = r17
2377
+ if r9
2378
+ r0 = r9
2379
+ else
2380
+ i15, s15 = index, []
2381
+ if has_terminal?('(', false, index)
2382
+ r16 = instantiate_node(SyntaxNode,input, index...(index + 1))
2383
+ @index += 1
2083
2384
  else
2084
- r16 = instantiate_node(SyntaxNode,input, index...index)
2385
+ terminal_parse_failure('(')
2386
+ r16 = nil
2085
2387
  end
2086
- s14 << r16
2388
+ s15 << r16
2087
2389
  if r16
2088
- r18 = _nt_expression
2089
- s14 << r18
2390
+ r18 = _nt_sp
2090
2391
  if r18
2091
- r20 = _nt_sp
2092
- if r20
2093
- r19 = r20
2094
- else
2095
- r19 = instantiate_node(SyntaxNode,input, index...index)
2096
- end
2097
- s14 << r19
2392
+ r17 = r18
2393
+ else
2394
+ r17 = instantiate_node(SyntaxNode,input, index...index)
2395
+ end
2396
+ s15 << r17
2397
+ if r17
2398
+ r19 = _nt_expression
2399
+ s15 << r19
2098
2400
  if r19
2099
- if has_terminal?(')', false, index)
2100
- r21 = instantiate_node(SyntaxNode,input, index...(index + 1))
2101
- @index += 1
2401
+ r21 = _nt_sp
2402
+ if r21
2403
+ r20 = r21
2102
2404
  else
2103
- terminal_parse_failure(')')
2104
- r21 = nil
2405
+ r20 = instantiate_node(SyntaxNode,input, index...index)
2406
+ end
2407
+ s15 << r20
2408
+ if r20
2409
+ if has_terminal?(')', false, index)
2410
+ r22 = instantiate_node(SyntaxNode,input, index...(index + 1))
2411
+ @index += 1
2412
+ else
2413
+ terminal_parse_failure(')')
2414
+ r22 = nil
2415
+ end
2416
+ s15 << r22
2105
2417
  end
2106
- s14 << r21
2107
2418
  end
2108
2419
  end
2109
2420
  end
2110
- end
2111
- if s14.last
2112
- r14 = instantiate_node(Expr,input, i14...index, s14)
2113
- r14.extend(Value2)
2114
- else
2115
- @index = i14
2116
- r14 = nil
2117
- end
2118
- if r14
2119
- r0 = r14
2120
- else
2121
- @index = i0
2122
- r0 = nil
2421
+ if s15.last
2422
+ r15 = instantiate_node(Expr,input, i15...index, s15)
2423
+ r15.extend(Value2)
2424
+ else
2425
+ @index = i15
2426
+ r15 = nil
2427
+ end
2428
+ if r15
2429
+ r0 = r15
2430
+ else
2431
+ @index = i0
2432
+ r0 = nil
2433
+ end
2123
2434
  end
2124
2435
  end
2125
2436
  end
@@ -66,6 +66,17 @@ grammar Delorean
66
66
  '[' sp? args:fn_args sp? ']' <ListExpr>
67
67
  end
68
68
 
69
+ rule set_expr
70
+ '{-}' <SetExpr>
71
+ /
72
+ '{' sp? e2:expression sp
73
+ 'for' sp i:identifier sp 'in' sp e1:expression sp?
74
+ ifexp:('if' sp e3:expression sp?)?
75
+ '}' <SetComprehension>
76
+ /
77
+ '{' sp? args:fn_args sp? '}' <SetExpr>
78
+ end
79
+
69
80
  rule hash_expr
70
81
  '{}' <HashExpr>
71
82
  /
@@ -80,7 +91,8 @@ grammar Delorean
80
91
  # NOTE: some operations such as << have side-effects (e.g. on
81
92
  # Arrays). So, be cautious about which opertaions are added.
82
93
  rule binary_op
83
- '+' / '-' / '*' / '/' / '%' / '==' / '!=' / '>=' / '<=' / '>' / '<' / '&&' / '||'
94
+ '==' / '!=' / '>=' / '<=' / '&&' / '||' /
95
+ '>' / '<' / '+' / '-' / '*' / '/' / '%' / '&' / '^' / '|'
84
96
  end
85
97
 
86
98
  rule unary_op
@@ -94,6 +106,7 @@ grammar Delorean
94
106
  nil_val /
95
107
  identifier /
96
108
  list_expr /
109
+ set_expr /
97
110
  hash_expr /
98
111
  mod:(m:class_name '::')? c:class_name <NodeAsValue> /
99
112
  '(' sp? e:expression sp? ')' <Expr>
@@ -29,7 +29,7 @@ module Delorean
29
29
  <<eos
30
30
  class #{cname}
31
31
  def self.#{aname}#{POST}(_e)
32
- _e['#{cname}.#{aname}'] ||=
32
+ _e[self.name+'.#{aname}'] ||=
33
33
  begin
34
34
  _e.fetch('#{aname}')
35
35
  rescue KeyError
@@ -101,7 +101,7 @@ eos
101
101
  # an attr is defined as a class function on the node class.
102
102
  "class #{context.last_node}; " +
103
103
  "def self.#{i.text_value}#{POST}(_e); " +
104
- "_e['#{context.last_node}.#{i.text_value}'] ||= " +
104
+ "_e[self.name+'.#{i.text_value}'] ||= " +
105
105
  e.rewrite(context) + "; end; end;"
106
106
  end
107
107
  end
@@ -396,6 +396,18 @@ eos
396
396
  end
397
397
  end
398
398
 
399
+ class SetExpr < ListExpr
400
+ def rewrite(context)
401
+ "Set#{super}"
402
+ end
403
+ end
404
+
405
+ class SetComprehension < ListComprehension
406
+ def rewrite(context)
407
+ "Set[*#{super}]"
408
+ end
409
+ end
410
+
399
411
  class HashComprehension < SNode
400
412
  def check(context, *)
401
413
  vname = i.text_value
@@ -1,3 +1,3 @@
1
1
  module Delorean
2
- VERSION = "0.1.02"
2
+ VERSION = "0.1.03"
3
3
  end
@@ -474,6 +474,16 @@ eof
474
474
  ]
475
475
  end
476
476
 
477
+ it "should eval sets and set comprehension" do
478
+ engine.parse defn("A:",
479
+ " a = {-}",
480
+ " b = {i*5 for i in {1,2,3}}",
481
+ " c = {1,2,3} | {4,5}",
482
+ )
483
+ engine.evaluate_attrs("A", ["a", "b", "c"]).should ==
484
+ [Set[], Set[5,10,15], Set[1,2,3,4,5]]
485
+ end
486
+
477
487
  it "should eval list comprehension" do
478
488
  engine.parse defn("A:",
479
489
  " b = [i*5 for i in [1,2,3]]",
@@ -739,4 +749,25 @@ eof
739
749
  r = engine.evaluate_attrs("A", ["a", "b", "c", "d"])
740
750
  r.should == [1, {"x"=>123, "y"=>456}, {"a"=>1, "b"=>{"x"=>123, "y"=>456}}, -333]
741
751
  end
752
+
753
+ it "should properly eval overridden attrs" do
754
+ engine.parse defn("A:",
755
+ " a = 5",
756
+ " b = a",
757
+ "B: A",
758
+ " a = 2",
759
+ " x = A.b - B.b",
760
+ " k = [A.b, B.b]",
761
+ " l = [x.b for x in [A, B]]",
762
+ " m = [x().b for x in [A, B]]",
763
+ )
764
+
765
+ engine.evaluate("A", "b").should == 5
766
+ engine.evaluate("B", "b").should == 2
767
+ engine.evaluate("B", "x").should == 3
768
+ engine.evaluate("B", "k").should == [5, 2]
769
+ engine.evaluate("B", "l").should == [5, 2]
770
+ engine.evaluate("B", "m").should == [5, 2]
771
+ end
772
+
742
773
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delorean_lang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.02
4
+ version: 0.1.03
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-20 00:00:00.000000000 Z
12
+ date: 2013-06-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: treetop