delorean_lang 0.1.02 → 0.1.03

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