sfrp 1.2.1 → 1.4.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 +4 -4
- data/README.md +2 -2
- data/base-library/Base.sfrp +3 -0
- data/base-library/Base/AVR/ATMEGA8/GPIO.c +79 -0
- data/base-library/Base/AVR/ATMEGA8/GPIO.h +15 -0
- data/base-library/Base/AVR/ATMEGA8/GPIO.sfrp +73 -0
- data/base-library/Base/{IO/AVR → AVR}/ATMEGA8/Timer.c +0 -0
- data/base-library/Base/{IO/AVR → AVR}/ATMEGA8/Timer.h +0 -0
- data/base-library/Base/{IO/AVR → AVR}/ATMEGA8/Timer.sfrp +0 -0
- data/base-library/Base/{IO/STDIO.c → STDIO.c} +0 -0
- data/base-library/Base/{IO/STDIO.h → STDIO.h} +0 -0
- data/base-library/Base/{IO/STDIO.sfrp → STDIO.sfrp} +0 -0
- data/lib/sfrp/flat/dsl.rb +12 -12
- data/lib/sfrp/flat/elements.rb +7 -7
- data/lib/sfrp/flat/expression.rb +10 -10
- data/lib/sfrp/input/parser.rb +1 -1
- data/lib/sfrp/input/transformer.rb +2 -1
- data/lib/sfrp/raw/dsl.rb +14 -14
- data/lib/sfrp/raw/elements.rb +28 -28
- data/lib/sfrp/raw/expression.rb +28 -28
- data/lib/sfrp/raw/namespace.rb +1 -1
- data/lib/sfrp/raw/set.rb +13 -13
- data/lib/sfrp/version.rb +1 -1
- data/spec/sfrp/Test.sfrp +1 -1
- data/spec/sfrp/input/parse_test.sfrp +2 -2
- data/test/IntTest/Main.sfrp +2 -2
- data/test/MaybeTest/Main.sfrp +2 -2
- data/test/MaybeTest/SubDir/Lib.sfrp +1 -1
- metadata +11 -11
- data/base-library/Base/IO/AVR/ATMEGA8/GPIO.c +0 -8
- data/base-library/Base/IO/AVR/ATMEGA8/GPIO.h +0 -6
- data/base-library/Base/IO/AVR/ATMEGA8/GPIO.sfrp +0 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cda721742189d74dac30ae37d3d0ec59d4b97085
|
|
4
|
+
data.tar.gz: 2a9ebf80928a7718b4241d5718f6f8d5fa1e035b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ead9d2c66049bd7bf9debe408f39ccaa4c7e842096c830274ac7c3ced18f4ee426f0522b845d3394eaba2023e5cebf18b3066b7a3dc9bf2de62779c45f8718cc
|
|
7
|
+
data.tar.gz: d658239d964311003df0fa64798981d0cb9dbcd75dfc63cdc8599fc6bef846707e8c9c5f4629d15753ed6d1654856944f22d257b9e9838abcffb7ae43191be69
|
data/README.md
CHANGED
|
@@ -19,12 +19,12 @@ Write following simple accumulator program.
|
|
|
19
19
|
```
|
|
20
20
|
-- Main.sfrp
|
|
21
21
|
import Base
|
|
22
|
-
import
|
|
22
|
+
import Base.STDIO as IO
|
|
23
23
|
|
|
24
24
|
in @x from IO.$getInt()
|
|
25
25
|
out IO.$putInt(@y)
|
|
26
26
|
|
|
27
|
-
@y 0 = @x + @@y
|
|
27
|
+
@y init 0 = @x + @@y
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
Compile and Run the program.
|
data/base-library/Base.sfrp
CHANGED
|
@@ -13,6 +13,9 @@ type Tuple5[a, b, c, d, e] = Tuple5(a, b, c, d, e)
|
|
|
13
13
|
fst(pair : (a, b)) : a = x where (x, _) = pair
|
|
14
14
|
snd(pair : (a, b)) : b = y where (_, y) = pair
|
|
15
15
|
|
|
16
|
+
infixl <> 0
|
|
17
|
+
op <>(a : Unit, b : Unit) : Unit = Unit
|
|
18
|
+
|
|
16
19
|
foreign - as '-(Int) : Int
|
|
17
20
|
foreign + as '+(Int) : Int
|
|
18
21
|
foreign ! as '!(Bool) : Bool
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#include <avr/io.h>
|
|
2
|
+
|
|
3
|
+
int debouncing(unsigned char count[], int pin_val, int num) {
|
|
4
|
+
if (pin_val) {
|
|
5
|
+
switch (count[num]) {
|
|
6
|
+
case 2:
|
|
7
|
+
count[num] = 1;
|
|
8
|
+
return 1;
|
|
9
|
+
case 1:
|
|
10
|
+
break;
|
|
11
|
+
case 0:
|
|
12
|
+
count[num] = 10;
|
|
13
|
+
break;
|
|
14
|
+
default:
|
|
15
|
+
count[num]--;
|
|
16
|
+
}
|
|
17
|
+
} else {
|
|
18
|
+
count[num] = 0;
|
|
19
|
+
}
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
// PB
|
|
25
|
+
|
|
26
|
+
int pinB(int num) {
|
|
27
|
+
DDRB &= ~(1 << num);
|
|
28
|
+
return (PINB & (1 << num)) == 0 ? 0 : 1;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
int posEdgePB(int num) {
|
|
32
|
+
static unsigned char count[8];
|
|
33
|
+
return debouncing(count, pinB(num), num);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
int portB(int port_num, int high_or_low) {
|
|
37
|
+
high_or_low = (high_or_low == 0 ? 0 : 1);
|
|
38
|
+
DDRB |= 1 << port_num;
|
|
39
|
+
PORTB = (~(1 << port_num) & PORTB) | (high_or_low << port_num);
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// PC
|
|
44
|
+
|
|
45
|
+
int pinC(int num) {
|
|
46
|
+
DDRC &= ~(1 << num);
|
|
47
|
+
return (PINC & (1 << num)) == 0 ? 0 : 1;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
int posEdgePC(int num) {
|
|
51
|
+
static unsigned char count[8];
|
|
52
|
+
return debouncing(count, pinC(num), num);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
int portC(int port_num, int high_or_low) {
|
|
56
|
+
high_or_low = (high_or_low == 0 ? 0 : 1);
|
|
57
|
+
DDRC |= 1 << port_num;
|
|
58
|
+
PORTC = (~(1 << port_num) & PORTC) | (high_or_low << port_num);
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// PD
|
|
63
|
+
|
|
64
|
+
int pinD(int num) {
|
|
65
|
+
DDRD &= ~(1 << num);
|
|
66
|
+
return (PIND & (1 << num)) == 0 ? 0 : 1;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
int posEdgePD(int num) {
|
|
70
|
+
static unsigned char count[8];
|
|
71
|
+
return debouncing(count, pinD(num), num);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
int portD(int port_num, int high_or_low) {
|
|
75
|
+
high_or_low = (high_or_low == 0 ? 0 : 1);
|
|
76
|
+
DDRD |= 1 << port_num;
|
|
77
|
+
PORTD = (~(1 << port_num) & PORTD) | (high_or_low << port_num);
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import Base
|
|
2
|
+
|
|
3
|
+
-- PB
|
|
4
|
+
|
|
5
|
+
foreign pinB as $pinB(Int) : Bool
|
|
6
|
+
in @pinB0 from $pinB(0)
|
|
7
|
+
in @pinB1 from $pinB(1)
|
|
8
|
+
in @pinB2 from $pinB(2)
|
|
9
|
+
in @pinB3 from $pinB(3)
|
|
10
|
+
in @pinB4 from $pinB(4)
|
|
11
|
+
in @pinB5 from $pinB(5)
|
|
12
|
+
in @pinB6 from $pinB(6)
|
|
13
|
+
in @pinB7 from $pinB(7)
|
|
14
|
+
|
|
15
|
+
foreign posEdgePB as $posEdgePB(Int) : Bool
|
|
16
|
+
in @posEdgePB0 from $posEdgePB(0)
|
|
17
|
+
in @posEdgePB1 from $posEdgePB(1)
|
|
18
|
+
in @posEdgePB2 from $posEdgePB(2)
|
|
19
|
+
in @posEdgePB3 from $posEdgePB(3)
|
|
20
|
+
in @posEdgePB4 from $posEdgePB(4)
|
|
21
|
+
in @posEdgePB5 from $posEdgePB(5)
|
|
22
|
+
in @posEdgePB6 from $posEdgePB(6)
|
|
23
|
+
in @posEdgePB7 from $posEdgePB(7)
|
|
24
|
+
|
|
25
|
+
foreign portB as $portB(Int, Bool) : Unit
|
|
26
|
+
|
|
27
|
+
-- PC
|
|
28
|
+
|
|
29
|
+
foreign pinC as $pinC(Int) : Bool
|
|
30
|
+
in @pinC0 from $pinC(0)
|
|
31
|
+
in @pinC1 from $pinC(1)
|
|
32
|
+
in @pinC2 from $pinC(2)
|
|
33
|
+
in @pinC3 from $pinC(3)
|
|
34
|
+
in @pinC4 from $pinC(4)
|
|
35
|
+
in @pinC5 from $pinC(5)
|
|
36
|
+
in @pinC6 from $pinC(6)
|
|
37
|
+
in @pinC7 from $pinC(7)
|
|
38
|
+
|
|
39
|
+
foreign posEdgePC as $posEdgePC(Int) : Bool
|
|
40
|
+
in @posEdgePC0 from $posEdgePC(0)
|
|
41
|
+
in @posEdgePC1 from $posEdgePC(1)
|
|
42
|
+
in @posEdgePC2 from $posEdgePC(2)
|
|
43
|
+
in @posEdgePC3 from $posEdgePC(3)
|
|
44
|
+
in @posEdgePC4 from $posEdgePC(4)
|
|
45
|
+
in @posEdgePC5 from $posEdgePC(5)
|
|
46
|
+
in @posEdgePC6 from $posEdgePC(6)
|
|
47
|
+
in @posEdgePC7 from $posEdgePC(7)
|
|
48
|
+
|
|
49
|
+
foreign portC as $portC(Int, Bool) : Unit
|
|
50
|
+
|
|
51
|
+
-- PD
|
|
52
|
+
|
|
53
|
+
foreign pinD as $pinD(Int) : Bool
|
|
54
|
+
in @pinD0 from $pinD(0)
|
|
55
|
+
in @pinD1 from $pinD(1)
|
|
56
|
+
in @pinD2 from $pinD(2)
|
|
57
|
+
in @pinD3 from $pinD(3)
|
|
58
|
+
in @pinD4 from $pinD(4)
|
|
59
|
+
in @pinD5 from $pinD(5)
|
|
60
|
+
in @pinD6 from $pinD(6)
|
|
61
|
+
in @pinD7 from $pinD(7)
|
|
62
|
+
|
|
63
|
+
foreign posEdgePD as $posEdgePD(Int) : Bool
|
|
64
|
+
in @posEdgePD0 from $posEdgePD(0)
|
|
65
|
+
in @posEdgePD1 from $posEdgePD(1)
|
|
66
|
+
in @posEdgePD2 from $posEdgePD(2)
|
|
67
|
+
in @posEdgePD3 from $posEdgePD(3)
|
|
68
|
+
in @posEdgePD4 from $posEdgePD(4)
|
|
69
|
+
in @posEdgePD5 from $posEdgePD(5)
|
|
70
|
+
in @posEdgePD6 from $posEdgePD(6)
|
|
71
|
+
in @posEdgePD7 from $posEdgePD(7)
|
|
72
|
+
|
|
73
|
+
foreign portD as $portD(Int, Bool) : Unit
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
data/lib/sfrp/flat/dsl.rb
CHANGED
|
@@ -2,32 +2,32 @@ module SFRP
|
|
|
2
2
|
module Flat
|
|
3
3
|
extend SFRP::F = self
|
|
4
4
|
|
|
5
|
-
def t(tconst_str, args
|
|
6
|
-
TypeAnnotationType.new(tconst_str, args
|
|
5
|
+
def t(tconst_str, args)
|
|
6
|
+
TypeAnnotationType.new(tconst_str, args)
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
def tv(var_str
|
|
10
|
-
TypeAnnotationVar.new(var_str
|
|
9
|
+
def tv(var_str)
|
|
10
|
+
TypeAnnotationVar.new(var_str)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def ft(ret_t, arg_ts)
|
|
14
14
|
FuncTypeAnnotation.new(ret_t, arg_ts)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def v_e(var_str
|
|
18
|
-
VarRefExp.new(var_str
|
|
17
|
+
def v_e(var_str)
|
|
18
|
+
VarRefExp.new(var_str)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def nr_e(node_str, last
|
|
22
|
-
NodeRefExp.new(node_str, last
|
|
21
|
+
def nr_e(node_str, last)
|
|
22
|
+
NodeRefExp.new(node_str, last)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
def call_e(func_str, args
|
|
26
|
-
FuncCallExp.new(func_str, args
|
|
25
|
+
def call_e(func_str, args)
|
|
26
|
+
FuncCallExp.new(func_str, args)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
def vc_call_e(vconst_str, args
|
|
30
|
-
VConstCallExp.new(vconst_str, args
|
|
29
|
+
def vc_call_e(vconst_str, args)
|
|
30
|
+
VConstCallExp.new(vconst_str, args)
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|
data/lib/sfrp/flat/elements.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module SFRP
|
|
2
2
|
module Flat
|
|
3
|
-
class Function < Struct.new(:str, :ret_ta, :pstrs, :ptas, :exp, :ffi_str
|
|
3
|
+
class Function < Struct.new(:str, :ret_ta, :pstrs, :ptas, :exp, :ffi_str)
|
|
4
4
|
def to_poly(_src_set, dest_set)
|
|
5
5
|
pstrs.reject(&:nil?).each do |s|
|
|
6
6
|
raise DuplicatedVariableError.new(s) if pstrs.count(s) > 1
|
|
@@ -20,7 +20,7 @@ module SFRP
|
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
class TConst < Struct.new(:str, :pstrs, :vc_strs, :native_str, :static
|
|
23
|
+
class TConst < Struct.new(:str, :pstrs, :vc_strs, :native_str, :static)
|
|
24
24
|
def type_annot
|
|
25
25
|
TypeAnnotationType.new(str, pstrs.map { |s| TypeAnnotationVar.new(s) })
|
|
26
26
|
end
|
|
@@ -31,7 +31,7 @@ module SFRP
|
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
class VConst < Struct.new(:str, :tconst_str, :native_str, :param_tas
|
|
34
|
+
class VConst < Struct.new(:str, :tconst_str, :native_str, :param_tas)
|
|
35
35
|
def to_poly(src_set, dest_set)
|
|
36
36
|
tconst = src_set.tconst(tconst_str)
|
|
37
37
|
fta = FuncTypeAnnotation.new(tconst.type_annot, param_tas)
|
|
@@ -39,7 +39,7 @@ module SFRP
|
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
class Node < Struct.new(:str, :ta, :exp, :init_exp
|
|
42
|
+
class Node < Struct.new(:str, :ta, :exp, :init_exp)
|
|
43
43
|
def initialized?
|
|
44
44
|
!init_exp.nil?
|
|
45
45
|
end
|
|
@@ -69,19 +69,19 @@ module SFRP
|
|
|
69
69
|
end
|
|
70
70
|
end
|
|
71
71
|
|
|
72
|
-
class FuncTypeAnnotation < Struct.new(:ret_ta, :arg_tas
|
|
72
|
+
class FuncTypeAnnotation < Struct.new(:ret_ta, :arg_tas)
|
|
73
73
|
def to_poly
|
|
74
74
|
Poly::FuncTypeAnnotation.new(ret_ta.to_poly, arg_tas.map(&:to_poly))
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
-
class TypeAnnotationType < Struct.new(:tconst_str, :arg_tas
|
|
78
|
+
class TypeAnnotationType < Struct.new(:tconst_str, :arg_tas)
|
|
79
79
|
def to_poly
|
|
80
80
|
P.t(tconst_str, *arg_tas.map(&:to_poly))
|
|
81
81
|
end
|
|
82
82
|
end
|
|
83
83
|
|
|
84
|
-
class TypeAnnotationVar < Struct.new(:var_str
|
|
84
|
+
class TypeAnnotationVar < Struct.new(:var_str)
|
|
85
85
|
def to_poly
|
|
86
86
|
P.tv(var_str)
|
|
87
87
|
end
|
data/lib/sfrp/flat/expression.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
module SFRP
|
|
2
2
|
module Flat
|
|
3
|
-
class FuncCallExp < Struct.new(:func_str, :arg_exps
|
|
3
|
+
class FuncCallExp < Struct.new(:func_str, :arg_exps)
|
|
4
4
|
def lift_node_ref(collected_node_refs)
|
|
5
5
|
args = arg_exps.map { |e| e.lift_node_ref(collected_node_refs) }
|
|
6
|
-
FuncCallExp.new(func_str, args
|
|
6
|
+
FuncCallExp.new(func_str, args)
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def alpha_convert(table, serial)
|
|
@@ -16,10 +16,10 @@ module SFRP
|
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
class VConstCallExp < Struct.new(:vconst_str, :arg_exps
|
|
19
|
+
class VConstCallExp < Struct.new(:vconst_str, :arg_exps)
|
|
20
20
|
def lift_node_ref(collected_node_refs)
|
|
21
21
|
args = arg_exps.map { |e| e.lift_node_ref(collected_node_refs) }
|
|
22
|
-
VConstCallExp.new(vconst_str, args
|
|
22
|
+
VConstCallExp.new(vconst_str, args)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def alpha_convert(table, serial)
|
|
@@ -32,7 +32,7 @@ module SFRP
|
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
class NodeRefExp < Struct.new(:node_str, :last
|
|
35
|
+
class NodeRefExp < Struct.new(:node_str, :last)
|
|
36
36
|
NodeRef = Struct.new(:node_str, :last)
|
|
37
37
|
|
|
38
38
|
def lift_node_ref(collected_node_refs)
|
|
@@ -40,7 +40,7 @@ module SFRP
|
|
|
40
40
|
unless collected_node_refs.include?(node_ref)
|
|
41
41
|
collected_node_refs << node_ref
|
|
42
42
|
end
|
|
43
|
-
VarRefExp.new("__node_ref_#{collected_node_refs.index(node_ref)}"
|
|
43
|
+
VarRefExp.new("__node_ref_#{collected_node_refs.index(node_ref)}")
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
def alpha_convert(_table, _serial)
|
|
@@ -52,10 +52,10 @@ module SFRP
|
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
class MatchExp < Struct.new(:left_exp, :cases
|
|
55
|
+
class MatchExp < Struct.new(:left_exp, :cases)
|
|
56
56
|
Case = Struct.new(:pattern, :exp)
|
|
57
57
|
|
|
58
|
-
class Pattern < Struct.new(:vconst_str, :ref_var_str, :args
|
|
58
|
+
class Pattern < Struct.new(:vconst_str, :ref_var_str, :args)
|
|
59
59
|
def alpha_convert(table, serial)
|
|
60
60
|
new_ref_var_str =
|
|
61
61
|
ref_var_str && (table[ref_var_str] = "_alpha#{serial.shift}")
|
|
@@ -84,7 +84,7 @@ module SFRP
|
|
|
84
84
|
new_cases = cases.map do |c|
|
|
85
85
|
Case.new(c.pattern, c.exp.lift_node_ref(collected_node_refs))
|
|
86
86
|
end
|
|
87
|
-
MatchExp.new(new_left_exp, new_cases
|
|
87
|
+
MatchExp.new(new_left_exp, new_cases)
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
def alpha_convert(table, serial)
|
|
@@ -107,7 +107,7 @@ module SFRP
|
|
|
107
107
|
end
|
|
108
108
|
end
|
|
109
109
|
|
|
110
|
-
class VarRefExp < Struct.new(:var_str
|
|
110
|
+
class VarRefExp < Struct.new(:var_str)
|
|
111
111
|
def lift_node_ref(_collected_node_refs)
|
|
112
112
|
self
|
|
113
113
|
end
|
data/lib/sfrp/input/parser.rb
CHANGED
|
@@ -132,7 +132,7 @@ module SFRP
|
|
|
132
132
|
ws? >> str(')')).as(:output_def)
|
|
133
133
|
}
|
|
134
134
|
rule(:init_def_maybe) {
|
|
135
|
-
(ws? >> exp.as(:init_exp)).maybe.as(:init_def_maybe)
|
|
135
|
+
(ws? >> str('init') >> ws >> exp.as(:init_exp)).maybe.as(:init_def_maybe)
|
|
136
136
|
}
|
|
137
137
|
rule(:foreign_str) {
|
|
138
138
|
(str('{') >> match['^}'].repeat(1).as(:str) >> str('}'))
|
|
@@ -185,7 +185,8 @@ module SFRP
|
|
|
185
185
|
|
|
186
186
|
# pattern
|
|
187
187
|
rule(:any_pattern => simple(:x)) {
|
|
188
|
-
|
|
188
|
+
var_str = x.to_s
|
|
189
|
+
Raw::MatchExp::Pattern.new(nil, var_str == '_' ? nil : var_str, [])
|
|
189
190
|
}
|
|
190
191
|
rule(:vc_pattern_with_paren => subtree(:x)) {
|
|
191
192
|
Raw::MatchExp::Pattern.new(x[:vconst_ref], x[:var_ref], x[:args])
|
data/lib/sfrp/raw/dsl.rb
CHANGED
|
@@ -6,36 +6,36 @@ module SFRP
|
|
|
6
6
|
Ref.new(rname, qualifier)
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
def t(tconst_ref, args
|
|
10
|
-
TypeAnnotationType.new(tconst_ref, args
|
|
9
|
+
def t(tconst_ref, args)
|
|
10
|
+
TypeAnnotationType.new(tconst_ref, args)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def tv(var_str
|
|
14
|
-
TypeAnnotationVar.new(var_str
|
|
13
|
+
def tv(var_str)
|
|
14
|
+
TypeAnnotationVar.new(var_str)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def ft(ret_t, arg_ts)
|
|
18
18
|
FuncTypeAnnotation.new(ret_t, arg_ts)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def v_e(var_str
|
|
22
|
-
VarRefExp.new(var_str
|
|
21
|
+
def v_e(var_str)
|
|
22
|
+
VarRefExp.new(var_str)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
def nr_e(node_ref, last
|
|
26
|
-
NodeRefExp.new(node_ref, last
|
|
25
|
+
def nr_e(node_ref, last)
|
|
26
|
+
NodeRefExp.new(node_ref, last)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
def call_e(func_ref, args
|
|
30
|
-
FuncCallExp.new(func_ref, args
|
|
29
|
+
def call_e(func_ref, args)
|
|
30
|
+
FuncCallExp.new(func_ref, args)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
def vc_call_e(vconst_ref, args
|
|
34
|
-
VConstCallExp.new(vconst_ref, args
|
|
33
|
+
def vc_call_e(vconst_ref, args)
|
|
34
|
+
VConstCallExp.new(vconst_ref, args)
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
def seq_e(exps, func_refs
|
|
38
|
-
SequenceExp.new(exps, func_refs
|
|
37
|
+
def seq_e(exps, func_refs)
|
|
38
|
+
SequenceExp.new(exps, func_refs)
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
end
|
data/lib/sfrp/raw/elements.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module SFRP
|
|
2
2
|
module Raw
|
|
3
|
-
class Function < Struct.new(:rname, :ns, :ret_ta, :pstrs, :ptas, :exp, :ffi_str, :effect
|
|
3
|
+
class Function < Struct.new(:rname, :ns, :ret_ta, :pstrs, :ptas, :exp, :ffi_str, :effect)
|
|
4
4
|
def absolute_name
|
|
5
5
|
ns.absolute_name(rname)
|
|
6
6
|
end
|
|
@@ -15,35 +15,35 @@ module SFRP
|
|
|
15
15
|
flat_ret_ta = ret_ta && ret_ta.to_flat(src_set, ns)
|
|
16
16
|
flat_ptas = ptas.map { |ta| ta && ta.to_flat(src_set, ns) }
|
|
17
17
|
dest_set << Flat::Function.new(
|
|
18
|
-
absolute_name, flat_ret_ta, pstrs, flat_ptas, flat_exp, ffi_str
|
|
18
|
+
absolute_name, flat_ret_ta, pstrs, flat_ptas, flat_exp, ffi_str
|
|
19
19
|
)
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
class TConst < Struct.new(:rname, :ns, :pstrs, :vconsts, :native_str, :static
|
|
23
|
+
class TConst < Struct.new(:rname, :ns, :pstrs, :vconsts, :native_str, :static)
|
|
24
24
|
def absolute_name
|
|
25
25
|
ns.absolute_name(rname)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def gen_flat(_src_set, dest_set)
|
|
29
29
|
vconst_strs = vconsts.map(&:absolute_name)
|
|
30
|
-
dest_set << Flat::TConst.new(absolute_name, pstrs, vconst_strs, native_str, static
|
|
30
|
+
dest_set << Flat::TConst.new(absolute_name, pstrs, vconst_strs, native_str, static)
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
class VConst < Struct.new(:rname, :tconst_rname, :ns, :native_str, :param_tas
|
|
34
|
+
class VConst < Struct.new(:rname, :tconst_rname, :ns, :native_str, :param_tas)
|
|
35
35
|
def absolute_name
|
|
36
36
|
ns.absolute_name(rname)
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
def gen_flat(src_set, dest_set)
|
|
40
|
-
tconst_str = src_set.tconst(ns, Ref.new(tconst_rname)
|
|
40
|
+
tconst_str = src_set.tconst(ns, Ref.new(tconst_rname)).absolute_name
|
|
41
41
|
flat_param_tas = param_tas.map { |ta| ta.to_flat(src_set, ns) }
|
|
42
|
-
dest_set << Flat::VConst.new(absolute_name, tconst_str, native_str, flat_param_tas
|
|
42
|
+
dest_set << Flat::VConst.new(absolute_name, tconst_str, native_str, flat_param_tas)
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
class PrimTConst < Struct.new(:rname, :ns, :native_str, :pat, :rep
|
|
46
|
+
class PrimTConst < Struct.new(:rname, :ns, :native_str, :pat, :rep)
|
|
47
47
|
def absolute_name
|
|
48
48
|
ns.absolute_name(rname)
|
|
49
49
|
end
|
|
@@ -54,11 +54,11 @@ module SFRP
|
|
|
54
54
|
|
|
55
55
|
def make_vconst(vconst_str)
|
|
56
56
|
raise vconst_str unless vconst_match?(vconst_str)
|
|
57
|
-
VConst.new(vconst_str, rname, ns, vconst_str.gsub(pat, rep), []
|
|
57
|
+
VConst.new(vconst_str, rname, ns, vconst_str.gsub(pat, rep), [])
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def gen_flat(_src_set, dest_set)
|
|
61
|
-
dest_set << Flat::TConst.new(absolute_name, [], nil, native_str, true
|
|
61
|
+
dest_set << Flat::TConst.new(absolute_name, [], nil, native_str, true)
|
|
62
62
|
end
|
|
63
63
|
end
|
|
64
64
|
|
|
@@ -78,7 +78,7 @@ module SFRP
|
|
|
78
78
|
end
|
|
79
79
|
end
|
|
80
80
|
|
|
81
|
-
class Node < Struct.new(:rname, :ns, :ta, :exp, :init_exp
|
|
81
|
+
class Node < Struct.new(:rname, :ns, :ta, :exp, :init_exp)
|
|
82
82
|
def absolute_name
|
|
83
83
|
ns.absolute_name(rname)
|
|
84
84
|
end
|
|
@@ -92,11 +92,11 @@ module SFRP
|
|
|
92
92
|
flat_ta = ta && ta.to_flat(src_set, ns)
|
|
93
93
|
flat_init_exp = init_exp && init_exp.to_flat(src_set, ns)
|
|
94
94
|
flat_exp = exp && exp.to_flat(src_set, ns)
|
|
95
|
-
dest_set << Flat::Node.new(absolute_name, flat_ta, flat_exp, flat_init_exp
|
|
95
|
+
dest_set << Flat::Node.new(absolute_name, flat_ta, flat_exp, flat_init_exp)
|
|
96
96
|
end
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
-
class Output < Struct.new(:ns, :exps, :func_ref, :line_number
|
|
99
|
+
class Output < Struct.new(:ns, :exps, :func_ref, :line_number)
|
|
100
100
|
def rname
|
|
101
101
|
"%output_line#{line_number}"
|
|
102
102
|
end
|
|
@@ -106,25 +106,25 @@ module SFRP
|
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
def convert
|
|
109
|
-
exp = FuncCallExp.new(func_ref, exps, false
|
|
109
|
+
exp = FuncCallExp.new(func_ref, exps, false)
|
|
110
110
|
ta = TypeAnnotationType.new(Ref.new('Unit'), [])
|
|
111
|
-
Node.new(rname, ns, ta, exp, nil
|
|
111
|
+
Node.new(rname, ns, ta, exp, nil)
|
|
112
112
|
end
|
|
113
113
|
end
|
|
114
114
|
|
|
115
|
-
class Input < Struct.new(:rname, :ns, :ta, :arg_exps, :init_exp, :func_ref
|
|
115
|
+
class Input < Struct.new(:rname, :ns, :ta, :arg_exps, :init_exp, :func_ref)
|
|
116
116
|
def convert
|
|
117
|
-
exp = FuncCallExp.new(func_ref, arg_exps, false
|
|
118
|
-
Node.new(rname, ns, ta, exp, init_exp
|
|
117
|
+
exp = FuncCallExp.new(func_ref, arg_exps, false)
|
|
118
|
+
Node.new(rname, ns, ta, exp, init_exp)
|
|
119
119
|
end
|
|
120
120
|
end
|
|
121
121
|
|
|
122
|
-
class Infix < Struct.new(:ns, :func_ref, :priority, :direction
|
|
122
|
+
class Infix < Struct.new(:ns, :func_ref, :priority, :direction)
|
|
123
123
|
LEFT, RIGHT, NONE = :left, :right, :none
|
|
124
124
|
|
|
125
125
|
def absolute_func_name(set)
|
|
126
|
-
func_name = set.func(ns, func_ref
|
|
127
|
-
raise NameError.new(func_ref.to_s
|
|
126
|
+
func_name = set.func(ns, func_ref).absolute_name
|
|
127
|
+
raise NameError.new(func_ref.to_s) unless func_name
|
|
128
128
|
func_name
|
|
129
129
|
end
|
|
130
130
|
|
|
@@ -140,24 +140,24 @@ module SFRP
|
|
|
140
140
|
end
|
|
141
141
|
end
|
|
142
142
|
|
|
143
|
-
class FuncTypeAnnotation < Struct.new(:ret_ta, :arg_tas
|
|
143
|
+
class FuncTypeAnnotation < Struct.new(:ret_ta, :arg_tas)
|
|
144
144
|
def to_flat(set, ns)
|
|
145
145
|
flat_arg_tas = arg_tas.map { |ta| ta.to_flat(set, ns) }
|
|
146
|
-
Flat::FuncTypeAnnotation.new(ret_ta.to_flat(set, ns), flat_arg_tas
|
|
146
|
+
Flat::FuncTypeAnnotation.new(ret_ta.to_flat(set, ns), flat_arg_tas)
|
|
147
147
|
end
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
class TypeAnnotationType < Struct.new(:tconst_ref, :arg_tas
|
|
150
|
+
class TypeAnnotationType < Struct.new(:tconst_ref, :arg_tas)
|
|
151
151
|
def to_flat(set, ns)
|
|
152
|
-
ab_tc_name = set.tconst(ns, tconst_ref
|
|
152
|
+
ab_tc_name = set.tconst(ns, tconst_ref).absolute_name
|
|
153
153
|
flat_arg_tas = arg_tas.map { |ta| ta.to_flat(set, ns) }
|
|
154
|
-
Flat::TypeAnnotationType.new(ab_tc_name, flat_arg_tas
|
|
154
|
+
Flat::TypeAnnotationType.new(ab_tc_name, flat_arg_tas)
|
|
155
155
|
end
|
|
156
156
|
end
|
|
157
157
|
|
|
158
|
-
class TypeAnnotationVar < Struct.new(:var_str
|
|
158
|
+
class TypeAnnotationVar < Struct.new(:var_str)
|
|
159
159
|
def to_flat(_set, _ns)
|
|
160
|
-
Flat::TypeAnnotationVar.new(var_str
|
|
160
|
+
Flat::TypeAnnotationVar.new(var_str)
|
|
161
161
|
end
|
|
162
162
|
end
|
|
163
163
|
end
|
data/lib/sfrp/raw/expression.rb
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
module SFRP
|
|
2
2
|
module Raw
|
|
3
|
-
class FuncCallExp < Struct.new(:func_ref, :arg_exps, :effect
|
|
3
|
+
class FuncCallExp < Struct.new(:func_ref, :arg_exps, :effect)
|
|
4
4
|
def vconst_refs
|
|
5
5
|
arg_exps.flat_map(&:vconst_refs)
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
def blame_side_effect
|
|
9
|
-
raise IllegalSideEffectError.new(func_ref.to_s
|
|
9
|
+
raise IllegalSideEffectError.new(func_ref.to_s) if effect
|
|
10
10
|
arg_exps.each(&:blame_side_effect)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def to_flat(set, ns)
|
|
14
|
-
ab_func_name = set.func(ns, func_ref
|
|
14
|
+
ab_func_name = set.func(ns, func_ref).absolute_name
|
|
15
15
|
args = arg_exps.map { |e| e.to_flat(set, ns) }
|
|
16
|
-
Flat::FuncCallExp.new(ab_func_name, args
|
|
16
|
+
Flat::FuncCallExp.new(ab_func_name, args)
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
class VConstCallExp < Struct.new(:vconst_ref, :arg_exps
|
|
20
|
+
class VConstCallExp < Struct.new(:vconst_ref, :arg_exps)
|
|
21
21
|
def vconst_refs
|
|
22
22
|
[vconst_ref, *arg_exps.flat_map(&:vconst_refs)]
|
|
23
23
|
end
|
|
@@ -27,13 +27,13 @@ module SFRP
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def to_flat(set, ns)
|
|
30
|
-
ab_vc_name = set.vconst(ns, vconst_ref
|
|
30
|
+
ab_vc_name = set.vconst(ns, vconst_ref).absolute_name
|
|
31
31
|
args = arg_exps.map { |e| e.to_flat(set, ns) }
|
|
32
|
-
Flat::VConstCallExp.new(ab_vc_name, args
|
|
32
|
+
Flat::VConstCallExp.new(ab_vc_name, args)
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
class NodeRefExp < Struct.new(:node_ref, :last
|
|
36
|
+
class NodeRefExp < Struct.new(:node_ref, :last)
|
|
37
37
|
def vconst_refs
|
|
38
38
|
[]
|
|
39
39
|
end
|
|
@@ -43,15 +43,15 @@ module SFRP
|
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def to_flat(set, ns)
|
|
46
|
-
ab_node_name = set.node(ns, node_ref
|
|
46
|
+
ab_node_name = set.node(ns, node_ref).absolute_name
|
|
47
47
|
Flat::NodeRefExp.new(ab_node_name, last)
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
class MatchExp < Struct.new(:left_exp, :cases
|
|
51
|
+
class MatchExp < Struct.new(:left_exp, :cases)
|
|
52
52
|
Case = Struct.new(:pattern, :exp)
|
|
53
53
|
|
|
54
|
-
class Pattern < Struct.new(:vconst_ref, :ref_var_str, :args
|
|
54
|
+
class Pattern < Struct.new(:vconst_ref, :ref_var_str, :args)
|
|
55
55
|
def vconst_refs
|
|
56
56
|
(vconst_ref ? [vconst_ref] : []) + args.flat_map(&:vconst_refs)
|
|
57
57
|
end
|
|
@@ -59,10 +59,10 @@ module SFRP
|
|
|
59
59
|
def to_flat(set, ns)
|
|
60
60
|
flat_args = args.map { |a| a.to_flat(set, ns) }
|
|
61
61
|
if vconst_ref
|
|
62
|
-
ab_vc_name = set.vconst(ns, vconst_ref
|
|
63
|
-
Flat::MatchExp::Pattern.new(ab_vc_name, ref_var_str, flat_args
|
|
62
|
+
ab_vc_name = set.vconst(ns, vconst_ref).absolute_name
|
|
63
|
+
Flat::MatchExp::Pattern.new(ab_vc_name, ref_var_str, flat_args)
|
|
64
64
|
else
|
|
65
|
-
Flat::MatchExp::Pattern.new(nil, ref_var_str, flat_args
|
|
65
|
+
Flat::MatchExp::Pattern.new(nil, ref_var_str, flat_args)
|
|
66
66
|
end
|
|
67
67
|
end
|
|
68
68
|
end
|
|
@@ -81,11 +81,11 @@ module SFRP
|
|
|
81
81
|
flat_pattern = c.pattern.to_flat(set, ns)
|
|
82
82
|
Flat::MatchExp::Case.new(flat_pattern, c.exp.to_flat(set, ns))
|
|
83
83
|
end
|
|
84
|
-
Flat::MatchExp.new(left_exp.to_flat(set, ns), flat_cases
|
|
84
|
+
Flat::MatchExp.new(left_exp.to_flat(set, ns), flat_cases)
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
-
class VarRefExp < Struct.new(:var_str
|
|
88
|
+
class VarRefExp < Struct.new(:var_str)
|
|
89
89
|
def vconst_refs
|
|
90
90
|
[]
|
|
91
91
|
end
|
|
@@ -95,11 +95,11 @@ module SFRP
|
|
|
95
95
|
end
|
|
96
96
|
|
|
97
97
|
def to_flat(_set, _ns)
|
|
98
|
-
Flat::VarRefExp.new(var_str
|
|
98
|
+
Flat::VarRefExp.new(var_str)
|
|
99
99
|
end
|
|
100
100
|
end
|
|
101
101
|
|
|
102
|
-
class SequenceExp < Struct.new(:exps, :func_refs
|
|
102
|
+
class SequenceExp < Struct.new(:exps, :func_refs)
|
|
103
103
|
def vconst_refs
|
|
104
104
|
exps.flat_map(&:vconst_refs)
|
|
105
105
|
end
|
|
@@ -110,11 +110,11 @@ module SFRP
|
|
|
110
110
|
|
|
111
111
|
def convert(set, ns)
|
|
112
112
|
return exps[0] if exps.size == 1
|
|
113
|
-
pos = set.weakest_op_position(ns, func_refs
|
|
114
|
-
lseq = SequenceExp.new(exps.take(pos + 1), func_refs.take(pos)
|
|
115
|
-
rseq = SequenceExp.new(exps.drop(pos + 1), func_refs.drop(pos + 1)
|
|
113
|
+
pos = set.weakest_op_position(ns, func_refs)
|
|
114
|
+
lseq = SequenceExp.new(exps.take(pos + 1), func_refs.take(pos))
|
|
115
|
+
rseq = SequenceExp.new(exps.drop(pos + 1), func_refs.drop(pos + 1))
|
|
116
116
|
args = [lseq.convert(set, ns), rseq.convert(set, ns)]
|
|
117
|
-
FuncCallExp.new(func_refs[pos], args, false
|
|
117
|
+
FuncCallExp.new(func_refs[pos], args, false)
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
def to_flat(set, ns)
|
|
@@ -136,23 +136,23 @@ module SFRP
|
|
|
136
136
|
end
|
|
137
137
|
end
|
|
138
138
|
|
|
139
|
-
class IfExp < Struct.new(:cond_exp, :then_exp, :else_exp
|
|
139
|
+
class IfExp < Struct.new(:cond_exp, :then_exp, :else_exp)
|
|
140
140
|
include SugarExp
|
|
141
141
|
|
|
142
142
|
def convert
|
|
143
143
|
cases = [
|
|
144
144
|
MatchExp::Case.new(
|
|
145
|
-
MatchExp::Pattern.new(Ref.new('True'), nil, []
|
|
145
|
+
MatchExp::Pattern.new(Ref.new('True'), nil, []), then_exp
|
|
146
146
|
),
|
|
147
147
|
MatchExp::Case.new(
|
|
148
|
-
MatchExp::Pattern.new(Ref.new('False'), nil, []
|
|
148
|
+
MatchExp::Pattern.new(Ref.new('False'), nil, []), else_exp
|
|
149
149
|
)
|
|
150
150
|
]
|
|
151
|
-
MatchExp.new(cond_exp, cases
|
|
151
|
+
MatchExp.new(cond_exp, cases)
|
|
152
152
|
end
|
|
153
153
|
end
|
|
154
154
|
|
|
155
|
-
class LetExp < Struct.new(:exp, :assignments
|
|
155
|
+
class LetExp < Struct.new(:exp, :assignments)
|
|
156
156
|
include SugarExp
|
|
157
157
|
|
|
158
158
|
Assignment = Struct.new(:pattern, :exp)
|
|
@@ -160,7 +160,7 @@ module SFRP
|
|
|
160
160
|
def convert
|
|
161
161
|
raise if assignments.empty?
|
|
162
162
|
assignments.reverse.reduce(exp) do |e, ass|
|
|
163
|
-
MatchExp.new(ass.exp, [MatchExp::Case.new(ass.pattern, e)]
|
|
163
|
+
MatchExp.new(ass.exp, [MatchExp::Case.new(ass.pattern, e)])
|
|
164
164
|
end
|
|
165
165
|
end
|
|
166
166
|
end
|
data/lib/sfrp/raw/namespace.rb
CHANGED
data/lib/sfrp/raw/set.rb
CHANGED
|
@@ -56,36 +56,36 @@ module SFRP
|
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
def weakest_op_position(ns, func_refs
|
|
60
|
-
ab_func_names = func_refs.map { |fr| func(ns, fr
|
|
59
|
+
def weakest_op_position(ns, func_refs)
|
|
60
|
+
ab_func_names = func_refs.map { |fr| func(ns, fr).absolute_name }
|
|
61
61
|
infix_h = Hash[@infixies.map { |i| [i.absolute_func_name(self), i] }]
|
|
62
62
|
ab_func_names.each_with_index.map do |x, idx|
|
|
63
63
|
[(infix_h.key?(x) ? infix_h[x].absolute_priority(idx) : [0, 0]), idx]
|
|
64
64
|
end.min[1]
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
def func(ns, func_ref
|
|
68
|
-
resolve(ns, func_ref, @func_h
|
|
67
|
+
def func(ns, func_ref)
|
|
68
|
+
resolve(ns, func_ref, @func_h)
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
def vconst(ns, vconst_ref
|
|
72
|
-
resolve(ns, vconst_ref, @vconst_h
|
|
71
|
+
def vconst(ns, vconst_ref)
|
|
72
|
+
resolve(ns, vconst_ref, @vconst_h)
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
def node(ns, node_ref
|
|
76
|
-
resolve(ns, node_ref, @node_h
|
|
75
|
+
def node(ns, node_ref)
|
|
76
|
+
resolve(ns, node_ref, @node_h)
|
|
77
77
|
end
|
|
78
78
|
|
|
79
|
-
def tconst(ns, tconst_ref
|
|
80
|
-
resolve(ns, tconst_ref, @tconst_h
|
|
79
|
+
def tconst(ns, tconst_ref)
|
|
80
|
+
resolve(ns, tconst_ref, @tconst_h)
|
|
81
81
|
end
|
|
82
82
|
|
|
83
83
|
private
|
|
84
84
|
|
|
85
|
-
def resolve(ns, ref, hash
|
|
85
|
+
def resolve(ns, ref, hash)
|
|
86
86
|
hits = ns.search_for_absolute_names(ref).select { |x| hash.key?(x) }
|
|
87
|
-
raise NameError.new(ref.to_s
|
|
88
|
-
raise AmbiguousNameError.new(ref.to_s, hits
|
|
87
|
+
raise NameError.new(ref.to_s) if hits.empty?
|
|
88
|
+
raise AmbiguousNameError.new(ref.to_s, hits) if hits.size > 1
|
|
89
89
|
hash[hits[0]]
|
|
90
90
|
end
|
|
91
91
|
|
data/lib/sfrp/version.rb
CHANGED
data/spec/sfrp/Test.sfrp
CHANGED
data/test/IntTest/Main.sfrp
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import Base
|
|
2
|
-
import Base.
|
|
2
|
+
import Base.STDIO as SIO
|
|
3
3
|
|
|
4
4
|
foreign init as $initProgram(Int) : Unit
|
|
5
5
|
init $initProgram(0)
|
|
6
6
|
|
|
7
|
-
in @input 0 from SIO.$getInt()
|
|
7
|
+
in @input init 0 from SIO.$getInt()
|
|
8
8
|
out SIO.$putInt(@x)
|
|
9
9
|
|
|
10
10
|
@x : Int = -(@@input * 1 + @input * 2)
|
data/test/MaybeTest/Main.sfrp
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import Base
|
|
2
|
-
import Base.
|
|
2
|
+
import Base.STDIO as SIO
|
|
3
3
|
import SubDir.Lib as Lib
|
|
4
4
|
|
|
5
5
|
in @maybeInt : Maybe[Int] from Lib.$getMaybeInt()
|
|
6
6
|
out SIO.$putInt(@acc)
|
|
7
7
|
|
|
8
|
-
@acc 0 : Int = @@acc + Lib.getOrElse(@maybeInt, 0)
|
|
8
|
+
@acc init 0 : Int = @@acc + Lib.getOrElse(@maybeInt, 0)
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sfrp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kensuke Sawada
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-12-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -168,15 +168,15 @@ files:
|
|
|
168
168
|
- README.md
|
|
169
169
|
- Rakefile
|
|
170
170
|
- base-library/Base.sfrp
|
|
171
|
-
- base-library/Base/
|
|
172
|
-
- base-library/Base/
|
|
173
|
-
- base-library/Base/
|
|
174
|
-
- base-library/Base/
|
|
175
|
-
- base-library/Base/
|
|
176
|
-
- base-library/Base/
|
|
177
|
-
- base-library/Base/
|
|
178
|
-
- base-library/Base/
|
|
179
|
-
- base-library/Base/
|
|
171
|
+
- base-library/Base/AVR/ATMEGA8/GPIO.c
|
|
172
|
+
- base-library/Base/AVR/ATMEGA8/GPIO.h
|
|
173
|
+
- base-library/Base/AVR/ATMEGA8/GPIO.sfrp
|
|
174
|
+
- base-library/Base/AVR/ATMEGA8/Timer.c
|
|
175
|
+
- base-library/Base/AVR/ATMEGA8/Timer.h
|
|
176
|
+
- base-library/Base/AVR/ATMEGA8/Timer.sfrp
|
|
177
|
+
- base-library/Base/STDIO.c
|
|
178
|
+
- base-library/Base/STDIO.h
|
|
179
|
+
- base-library/Base/STDIO.sfrp
|
|
180
180
|
- bin/sfrp
|
|
181
181
|
- lib/sfrp.rb
|
|
182
182
|
- lib/sfrp/command.rb
|