emfrp 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +45 -12
- data/bin/emfrp +4 -1
- data/examples/LCDClock/LCDClock.mfrp +93 -93
- data/examples/LCDClock/LCDClock_LPC1768.bin +0 -0
- data/examples/LCDClock/README.md +24 -24
- data/examples/LCDPositioner/LCDPositioner.mfrp +30 -30
- data/examples/LCDPositioner/LCDPositionerMain.c +15 -15
- data/examples/MostDistantPoint/MostDistantPoint.mfrp +25 -25
- data/examples/MostDistantPoint/MostDistantPointMain.c +14 -14
- data/lib/emfrp/compile/c/alloc.rb +200 -200
- data/lib/emfrp/compile/c/codegen.rb +18 -18
- data/lib/emfrp/compile/c/codegen_context.rb +218 -218
- data/lib/emfrp/compile/c/monofy.rb +185 -185
- data/lib/emfrp/compile/c/syntax_codegen.rb +364 -364
- data/lib/emfrp/compile/c/syntax_exp_codegen.rb +119 -119
- data/lib/emfrp/compile/graphviz/graphviz.rb +53 -53
- data/lib/emfrp/compile_error.rb +95 -95
- data/lib/emfrp/interpreter/command_manager.rb +367 -367
- data/lib/emfrp/interpreter/evaluater.rb +146 -146
- data/lib/emfrp/interpreter/file_loader.rb +52 -52
- data/lib/emfrp/interpreter/interpreter.rb +200 -195
- data/lib/emfrp/parser/expression.rb +386 -386
- data/lib/emfrp/parser/misc.rb +184 -184
- data/lib/emfrp/parser/newnode_convert.rb +72 -72
- data/lib/emfrp/parser/operator.rb +25 -25
- data/lib/emfrp/parser/parser.rb +150 -150
- data/lib/emfrp/parser/parsing_error.rb +49 -49
- data/lib/emfrp/parser/toplevel.rb +555 -555
- data/lib/emfrp/pre_convert/pre_convert.rb +32 -32
- data/lib/emfrp/syntax.rb +171 -171
- data/lib/emfrp/typing/typing_error.rb +47 -47
- data/lib/emfrp/typing/union_type.rb +197 -197
- data/lib/emfrp/version.rb +1 -1
- data/mfrp_include/Std.mfrp +122 -122
- data/tests/Rakefile +8 -8
- data/tests/Rakefile.common +27 -27
- data/tests/command/Rakefile +2 -2
- data/tests/command/ReplaceNode.mfrp +39 -39
- data/tests/compiler/ComplexDataType/ComplexDataType.mfrp +14 -14
- data/tests/compiler/ComplexDataType/ComplexDataTypeMain.c +15 -15
- data/tests/compiler/ComplexDataType/Rakefile +2 -2
- data/tests/compiler/ComplexDataType/expected_out.txt +0 -0
- data/tests/compiler/ComplexDataType/in.txt +5 -5
- data/tests/compiler/LCDClock/LCDClock.mfrp +90 -90
- data/tests/compiler/LCDClock/LCDClockMain.c +0 -0
- data/tests/compiler/LCDClock/Rakefile +2 -2
- data/tests/compiler/LCDClock/expected_out.txt +0 -0
- data/tests/compiler/LCDClock/in.txt +0 -0
- data/tests/compiler/LCDPositioner/LCDPositioner.mfrp +30 -30
- data/tests/compiler/LCDPositioner/LCDPositionerMain.c +15 -15
- data/tests/compiler/LCDPositioner/Rakefile +2 -2
- data/tests/compiler/LCDPositioner/graph.dot +0 -0
- data/tests/compiler/LCDPositioner/graph.png +0 -0
- data/tests/compiler/Rakefile +8 -8
- data/tests/compiler/Rakefile.common +23 -23
- data/tests/compiler/UseData/Rakefile +2 -2
- data/tests/compiler/UseData/UseData.mfrp +8 -8
- data/tests/compiler/UseSubModule/Rakefile +2 -2
- data/tests/compiler/UseSubModule/SubModule.mfrp +8 -8
- data/tests/compiler/UseSubModule/SubModule2.mfrp +5 -5
- data/tests/compiler/UseSubModule/UseSubModule.mfrp +11 -11
- data/tests/core/FromAnnotation.mfrp +18 -18
- data/tests/core/Last.mfrp +10 -10
- data/tests/core/Rakefile +2 -2
- data/tests/core/TypingTest.mfrp +11 -11
- data/tests/core/WithoutInputs.mfrp +19 -19
- data/tests/load_time_error/Rakefile +32 -32
- data/tests/load_time_error/TypeMismatch.mfrp +4 -4
- metadata +3 -3
data/tests/Rakefile.common
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
-
require 'emfrp'
|
3
|
-
|
4
|
-
TARGETS = Dir.glob("./*.mfrp").map{|x| x =~ /^\.\/(.*).mfrp$/; $1}
|
5
|
-
|
6
|
-
def exec_test(file_name)
|
7
|
-
puts "TESTING #{file_name}".colorize(:light_blue)
|
8
|
-
inter = Emfrp::Interpreter.new(Emfrp::IncludeDirs, STDOUT, file_name)
|
9
|
-
unless inter.exec_embedded_commands(true)
|
10
|
-
puts " => ok".colorize(:green)
|
11
|
-
else
|
12
|
-
puts " => fail".colorize(:red)
|
13
|
-
end
|
14
|
-
rescue => err
|
15
|
-
puts err.inspect
|
16
|
-
puts " => fail".colorize(:red)
|
17
|
-
end
|
18
|
-
|
19
|
-
TARGETS.each do |t|
|
20
|
-
file t do
|
21
|
-
exec_test(t)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
file "Std" do
|
26
|
-
exec_test("Std")
|
27
|
-
end
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'emfrp'
|
3
|
+
|
4
|
+
TARGETS = Dir.glob("./*.mfrp").map{|x| x =~ /^\.\/(.*).mfrp$/; $1}
|
5
|
+
|
6
|
+
def exec_test(file_name)
|
7
|
+
puts "TESTING #{file_name}".colorize(:light_blue)
|
8
|
+
inter = Emfrp::Interpreter.new(Emfrp::IncludeDirs, STDOUT, file_name)
|
9
|
+
unless inter.exec_embedded_commands(true)
|
10
|
+
puts " => ok".colorize(:green)
|
11
|
+
else
|
12
|
+
puts " => fail".colorize(:red)
|
13
|
+
end
|
14
|
+
rescue => err
|
15
|
+
puts err.inspect
|
16
|
+
puts " => fail".colorize(:red)
|
17
|
+
end
|
18
|
+
|
19
|
+
TARGETS.each do |t|
|
20
|
+
file t do
|
21
|
+
exec_test(t)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
file "Std" do
|
26
|
+
exec_test("Std")
|
27
|
+
end
|
data/tests/command/Rakefile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
load File.expand_path('../../Rakefile.common', __FILE__)
|
2
|
-
task :default => TARGETS
|
1
|
+
load File.expand_path('../../Rakefile.common', __FILE__)
|
2
|
+
task :default => TARGETS
|
@@ -1,39 +1,39 @@
|
|
1
|
-
module ReplaceNodeCommand in x : Int out y use Std
|
2
|
-
|
3
|
-
node a = x + 1
|
4
|
-
node b = a + 1
|
5
|
-
node c = b + 1
|
6
|
-
|
7
|
-
node i = x + 2
|
8
|
-
node j = i + 2
|
9
|
-
node k = j + 2
|
10
|
-
|
11
|
-
node z = 1.0
|
12
|
-
|
13
|
-
node init[0] p = 1
|
14
|
-
node q = 0
|
15
|
-
|
16
|
-
node y = c
|
17
|
-
|
18
|
-
#@ :assert-error replace_node_err1 =>
|
19
|
-
#- :replace-node hoge => b
|
20
|
-
|
21
|
-
#@ :assert-error replace_node_err2 =>
|
22
|
-
#- :replace-node b => hoge
|
23
|
-
|
24
|
-
#@ :assert-error replace_node_err3 =>
|
25
|
-
#- :replace-node b => z
|
26
|
-
|
27
|
-
#@ :assert-error replace_node_err4 =>
|
28
|
-
#- :replace-node c => b
|
29
|
-
|
30
|
-
#@ :assert-error replace_node_err4 =>
|
31
|
-
#- :replace-node a => b
|
32
|
-
|
33
|
-
#@ :assert-error replace_node_err5 =>
|
34
|
-
#- :replace-node p => q
|
35
|
-
|
36
|
-
#@ :replace-node b => j
|
37
|
-
#@ :assert-module
|
38
|
-
#- 0 => 5
|
39
|
-
#@ : 1 => 6
|
1
|
+
module ReplaceNodeCommand in x : Int out y use Std
|
2
|
+
|
3
|
+
node a = x + 1
|
4
|
+
node b = a + 1
|
5
|
+
node c = b + 1
|
6
|
+
|
7
|
+
node i = x + 2
|
8
|
+
node j = i + 2
|
9
|
+
node k = j + 2
|
10
|
+
|
11
|
+
node z = 1.0
|
12
|
+
|
13
|
+
node init[0] p = 1
|
14
|
+
node q = 0
|
15
|
+
|
16
|
+
node y = c
|
17
|
+
|
18
|
+
#@ :assert-error replace_node_err1 =>
|
19
|
+
#- :replace-node hoge => b
|
20
|
+
|
21
|
+
#@ :assert-error replace_node_err2 =>
|
22
|
+
#- :replace-node b => hoge
|
23
|
+
|
24
|
+
#@ :assert-error replace_node_err3 =>
|
25
|
+
#- :replace-node b => z
|
26
|
+
|
27
|
+
#@ :assert-error replace_node_err4 =>
|
28
|
+
#- :replace-node c => b
|
29
|
+
|
30
|
+
#@ :assert-error replace_node_err4 =>
|
31
|
+
#- :replace-node a => b
|
32
|
+
|
33
|
+
#@ :assert-error replace_node_err5 =>
|
34
|
+
#- :replace-node p => q
|
35
|
+
|
36
|
+
#@ :replace-node b => j
|
37
|
+
#@ :assert-module
|
38
|
+
#- 0 => 5
|
39
|
+
#@ : 1 => 6
|
@@ -1,14 +1,14 @@
|
|
1
|
-
module ComplexDataType
|
2
|
-
in i : Int
|
3
|
-
out out1, out2
|
4
|
-
use Std
|
5
|
-
|
6
|
-
node x = ((i, i), (i, i), (i, i))
|
7
|
-
|
8
|
-
node y = {
|
9
|
-
ii = i.intToDouble
|
10
|
-
((ii, ii), (ii, ii), (ii, ii))
|
11
|
-
}
|
12
|
-
|
13
|
-
node out1 = x of ((a, _), _, _) -> a
|
14
|
-
node out2 = y of ((a, _), _, _) -> a
|
1
|
+
module ComplexDataType
|
2
|
+
in i : Int
|
3
|
+
out out1, out2
|
4
|
+
use Std
|
5
|
+
|
6
|
+
node x = ((i, i), (i, i), (i, i))
|
7
|
+
|
8
|
+
node y = {
|
9
|
+
ii = i.intToDouble
|
10
|
+
((ii, ii), (ii, ii), (ii, ii))
|
11
|
+
}
|
12
|
+
|
13
|
+
node out1 = x of ((a, _), _, _) -> a
|
14
|
+
node out2 = y of ((a, _), _, _) -> a
|
@@ -1,15 +1,15 @@
|
|
1
|
-
#include "ComplexDataType.h"
|
2
|
-
#include <stdio.h>
|
3
|
-
#include <stdlib.h>
|
4
|
-
|
5
|
-
void Input(int* i) {
|
6
|
-
if (scanf("%d", i) == EOF) {
|
7
|
-
exit(0);
|
8
|
-
}
|
9
|
-
}
|
10
|
-
void Output(int* out1, double* out2) {
|
11
|
-
printf("%d %.3lf\n", *out1, *out2);
|
12
|
-
}
|
13
|
-
int main() {
|
14
|
-
ActivateComplexDataType();
|
15
|
-
}
|
1
|
+
#include "ComplexDataType.h"
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <stdlib.h>
|
4
|
+
|
5
|
+
void Input(int* i) {
|
6
|
+
if (scanf("%d", i) == EOF) {
|
7
|
+
exit(0);
|
8
|
+
}
|
9
|
+
}
|
10
|
+
void Output(int* out1, double* out2) {
|
11
|
+
printf("%d %.3lf\n", *out1, *out2);
|
12
|
+
}
|
13
|
+
int main() {
|
14
|
+
ActivateComplexDataType();
|
15
|
+
}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
NAME = "ComplexDataType"
|
2
|
-
load File.expand_path('../../Rakefile.common', __FILE__)
|
1
|
+
NAME = "ComplexDataType"
|
2
|
+
load File.expand_path('../../Rakefile.common', __FILE__)
|
File without changes
|
@@ -1,5 +1,5 @@
|
|
1
|
-
1
|
2
|
-
2
|
3
|
-
3
|
4
|
-
4
|
5
|
-
5
|
1
|
+
1
|
2
|
+
2
|
3
|
+
3
|
4
|
+
4
|
5
|
+
5
|
@@ -1,90 +1,90 @@
|
|
1
|
-
module LCDClock
|
2
|
-
in
|
3
|
-
btnMode(False) : Bool, # Is mode-button pushed now?
|
4
|
-
btnNext(False) : Bool, # Is next-button pushed now?
|
5
|
-
btnRotate(False) : Bool, # Is rotate-button pushed now?
|
6
|
-
pulse100ms : Bool # input to be True only once per 100ms
|
7
|
-
out
|
8
|
-
hour, min, sec, # current time to display
|
9
|
-
maskHour, maskMin, maskSec # Is it now needed to display -- instead of two-digits?
|
10
|
-
use
|
11
|
-
Std
|
12
|
-
|
13
|
-
# Functions
|
14
|
-
# --------------------
|
15
|
-
|
16
|
-
type Mode = Normal | Edit
|
17
|
-
type TPos = HPos | MPos | SPos
|
18
|
-
type Time = Time(Int, Int, Int)
|
19
|
-
|
20
|
-
func nextMode(m) = m of Normal -> Edit, Edit -> Normal
|
21
|
-
|
22
|
-
func editable(m) = m of Normal -> False, Edit -> True
|
23
|
-
|
24
|
-
func nextPos(p) = p of HPos -> MPos, MPos -> SPos, SPos -> HPos
|
25
|
-
|
26
|
-
func positiveEdge(a, b) = !a && b
|
27
|
-
|
28
|
-
# proceed Time by 1sec
|
29
|
-
func proceedTime(t) = {
|
30
|
-
Time(h, m, s) = t
|
31
|
-
newS = s + 1
|
32
|
-
newM = m + (newS / 60)
|
33
|
-
newH = h + (newM / 60)
|
34
|
-
Time(newH % 24, newM % 60, newS % 60)
|
35
|
-
}
|
36
|
-
|
37
|
-
func roundingTime(t, dh, dm, ds) = {
|
38
|
-
Time(h, m, s) = t
|
39
|
-
Time((h + dh) % 24, (m + dm) % 60, (s + ds) % 60)
|
40
|
-
}
|
41
|
-
|
42
|
-
# Nodes
|
43
|
-
# --------------------
|
44
|
-
|
45
|
-
# mod-10 counter incremented by every 100ms
|
46
|
-
node init[0] counter : Int =
|
47
|
-
(if pulse100ms then counter@last + 1 else counter@last) % 10
|
48
|
-
|
49
|
-
# time-varying value to be True only once per 1sec
|
50
|
-
node pulse1s : Bool =
|
51
|
-
counter == 0 && counter@last != 0
|
52
|
-
|
53
|
-
# time-varying value switching True/False by every 500ms
|
54
|
-
node flash : Bool =
|
55
|
-
counter < 5
|
56
|
-
|
57
|
-
# time-varying value representing current time-set mode
|
58
|
-
node init[Normal] curMode : Mode =
|
59
|
-
if btnMode@last `positiveEdge` btnMode then curMode@last.nextMode else curMode@last
|
60
|
-
|
61
|
-
# time-varying value representing current editing-cursor-position
|
62
|
-
node init[HPos] curPos : TPos =
|
63
|
-
if btnNext@last `positiveEdge` btnNext then curPos@last.nextPos else curPos@last
|
64
|
-
|
65
|
-
# time-varying value representing diffs to add to current time.
|
66
|
-
node (dh, dm, ds) : (Int, Int, Int) =
|
67
|
-
if curMode.editable && (btnRotate@last `positiveEdge` btnRotate) then
|
68
|
-
curPos of:
|
69
|
-
HPos -> (1, 0, 0)
|
70
|
-
MPos -> (0, 1, 0)
|
71
|
-
SPos -> (0, 0, 1)
|
72
|
-
else
|
73
|
-
(0, 0, 0)
|
74
|
-
|
75
|
-
# time-varying value representing current time
|
76
|
-
node init[Time(0, 0, 0)] Time(hour, min, sec) as curTime =
|
77
|
-
if pulse1s then
|
78
|
-
curTime@last.proceedTime.roundingTime(dh, dm, ds)
|
79
|
-
else
|
80
|
-
curTime@last.roundingTime(dh, dm, ds)
|
81
|
-
|
82
|
-
# time-varying value representing need of masking
|
83
|
-
node (maskHour, maskMin, maskSec) =
|
84
|
-
if curMode.editable && flash then
|
85
|
-
curPos of:
|
86
|
-
HPos -> (True, False, False)
|
87
|
-
MPos -> (False, True, False)
|
88
|
-
SPos -> (False, False, True)
|
89
|
-
else
|
90
|
-
(False, False, False)
|
1
|
+
module LCDClock
|
2
|
+
in
|
3
|
+
btnMode(False) : Bool, # Is mode-button pushed now?
|
4
|
+
btnNext(False) : Bool, # Is next-button pushed now?
|
5
|
+
btnRotate(False) : Bool, # Is rotate-button pushed now?
|
6
|
+
pulse100ms : Bool # input to be True only once per 100ms
|
7
|
+
out
|
8
|
+
hour, min, sec, # current time to display
|
9
|
+
maskHour, maskMin, maskSec # Is it now needed to display -- instead of two-digits?
|
10
|
+
use
|
11
|
+
Std
|
12
|
+
|
13
|
+
# Functions
|
14
|
+
# --------------------
|
15
|
+
|
16
|
+
type Mode = Normal | Edit
|
17
|
+
type TPos = HPos | MPos | SPos
|
18
|
+
type Time = Time(Int, Int, Int)
|
19
|
+
|
20
|
+
func nextMode(m) = m of Normal -> Edit, Edit -> Normal
|
21
|
+
|
22
|
+
func editable(m) = m of Normal -> False, Edit -> True
|
23
|
+
|
24
|
+
func nextPos(p) = p of HPos -> MPos, MPos -> SPos, SPos -> HPos
|
25
|
+
|
26
|
+
func positiveEdge(a, b) = !a && b
|
27
|
+
|
28
|
+
# proceed Time by 1sec
|
29
|
+
func proceedTime(t) = {
|
30
|
+
Time(h, m, s) = t
|
31
|
+
newS = s + 1
|
32
|
+
newM = m + (newS / 60)
|
33
|
+
newH = h + (newM / 60)
|
34
|
+
Time(newH % 24, newM % 60, newS % 60)
|
35
|
+
}
|
36
|
+
|
37
|
+
func roundingTime(t, dh, dm, ds) = {
|
38
|
+
Time(h, m, s) = t
|
39
|
+
Time((h + dh) % 24, (m + dm) % 60, (s + ds) % 60)
|
40
|
+
}
|
41
|
+
|
42
|
+
# Nodes
|
43
|
+
# --------------------
|
44
|
+
|
45
|
+
# mod-10 counter incremented by every 100ms
|
46
|
+
node init[0] counter : Int =
|
47
|
+
(if pulse100ms then counter@last + 1 else counter@last) % 10
|
48
|
+
|
49
|
+
# time-varying value to be True only once per 1sec
|
50
|
+
node pulse1s : Bool =
|
51
|
+
counter == 0 && counter@last != 0
|
52
|
+
|
53
|
+
# time-varying value switching True/False by every 500ms
|
54
|
+
node flash : Bool =
|
55
|
+
counter < 5
|
56
|
+
|
57
|
+
# time-varying value representing current time-set mode
|
58
|
+
node init[Normal] curMode : Mode =
|
59
|
+
if btnMode@last `positiveEdge` btnMode then curMode@last.nextMode else curMode@last
|
60
|
+
|
61
|
+
# time-varying value representing current editing-cursor-position
|
62
|
+
node init[HPos] curPos : TPos =
|
63
|
+
if btnNext@last `positiveEdge` btnNext then curPos@last.nextPos else curPos@last
|
64
|
+
|
65
|
+
# time-varying value representing diffs to add to current time.
|
66
|
+
node (dh, dm, ds) : (Int, Int, Int) =
|
67
|
+
if curMode.editable && (btnRotate@last `positiveEdge` btnRotate) then
|
68
|
+
curPos of:
|
69
|
+
HPos -> (1, 0, 0)
|
70
|
+
MPos -> (0, 1, 0)
|
71
|
+
SPos -> (0, 0, 1)
|
72
|
+
else
|
73
|
+
(0, 0, 0)
|
74
|
+
|
75
|
+
# time-varying value representing current time
|
76
|
+
node init[Time(0, 0, 0)] Time(hour, min, sec) as curTime =
|
77
|
+
if pulse1s then
|
78
|
+
curTime@last.proceedTime.roundingTime(dh, dm, ds)
|
79
|
+
else
|
80
|
+
curTime@last.roundingTime(dh, dm, ds)
|
81
|
+
|
82
|
+
# time-varying value representing need of masking
|
83
|
+
node (maskHour, maskMin, maskSec) =
|
84
|
+
if curMode.editable && flash then
|
85
|
+
curPos of:
|
86
|
+
HPos -> (True, False, False)
|
87
|
+
MPos -> (False, True, False)
|
88
|
+
SPos -> (False, False, True)
|
89
|
+
else
|
90
|
+
(False, False, False)
|
File without changes
|
@@ -1,2 +1,2 @@
|
|
1
|
-
NAME = "LCDClock"
|
2
|
-
load File.expand_path('../../Rakefile.common', __FILE__)
|
1
|
+
NAME = "LCDClock"
|
2
|
+
load File.expand_path('../../Rakefile.common', __FILE__)
|
File without changes
|
File without changes
|
@@ -1,30 +1,30 @@
|
|
1
|
-
module LCDPositioner
|
2
|
-
in
|
3
|
-
up : Bool,
|
4
|
-
down : Bool,
|
5
|
-
left : Bool,
|
6
|
-
right : Bool,
|
7
|
-
pulse10ms : Bool
|
8
|
-
out
|
9
|
-
x, y
|
10
|
-
use
|
11
|
-
Std
|
12
|
-
|
13
|
-
node dy = down.boolToInt - up.boolToInt
|
14
|
-
node dx = right.boolToInt - left.boolToInt
|
15
|
-
|
16
|
-
node init[(False, 0)] (pulse40ms, pulse40msCount) as pulse = {
|
17
|
-
c = (pulse40msCount@last + pulse10ms.boolToInt) % 4
|
18
|
-
(c == 0 && pulse10ms, c)
|
19
|
-
}
|
20
|
-
|
21
|
-
node init[(0,0)] (x, y) as pos =
|
22
|
-
if pulse40ms then (x@last + dx, y@last + dy) else pos@last
|
23
|
-
|
24
|
-
|
25
|
-
#@ :assert-module
|
26
|
-
#- True, False, False, False, True => 0, 0
|
27
|
-
#@ : True, False, False, False, True => 0, 0
|
28
|
-
#@ : True, False, False, False, True => 0, 0
|
29
|
-
#@ : True, False, False, False, True => 0, -1
|
30
|
-
#@ : True, False, False, False, True => 0, -1
|
1
|
+
module LCDPositioner
|
2
|
+
in
|
3
|
+
up : Bool,
|
4
|
+
down : Bool,
|
5
|
+
left : Bool,
|
6
|
+
right : Bool,
|
7
|
+
pulse10ms : Bool
|
8
|
+
out
|
9
|
+
x, y
|
10
|
+
use
|
11
|
+
Std
|
12
|
+
|
13
|
+
node dy = down.boolToInt - up.boolToInt
|
14
|
+
node dx = right.boolToInt - left.boolToInt
|
15
|
+
|
16
|
+
node init[(False, 0)] (pulse40ms, pulse40msCount) as pulse = {
|
17
|
+
c = (pulse40msCount@last + pulse10ms.boolToInt) % 4
|
18
|
+
(c == 0 && pulse10ms, c)
|
19
|
+
}
|
20
|
+
|
21
|
+
node init[(0,0)] (x, y) as pos =
|
22
|
+
if pulse40ms then (x@last + dx, y@last + dy) else pos@last
|
23
|
+
|
24
|
+
|
25
|
+
#@ :assert-module
|
26
|
+
#- True, False, False, False, True => 0, 0
|
27
|
+
#@ : True, False, False, False, True => 0, 0
|
28
|
+
#@ : True, False, False, False, True => 0, 0
|
29
|
+
#@ : True, False, False, False, True => 0, -1
|
30
|
+
#@ : True, False, False, False, True => 0, -1
|
@@ -1,15 +1,15 @@
|
|
1
|
-
#include "LCDPositioner.h"
|
2
|
-
#include <stdio.h>
|
3
|
-
#include <stdlib.h>
|
4
|
-
|
5
|
-
void Input(int* up, int* down, int* left, int* right, int* pulse10ms) {
|
6
|
-
if (scanf("%d %d %d %d %d", up, down, left, right, pulse10ms) == EOF) {
|
7
|
-
exit(0);
|
8
|
-
}
|
9
|
-
}
|
10
|
-
void Output(int* x, int* y) {
|
11
|
-
printf("%d %d\n", *x, *y);
|
12
|
-
}
|
13
|
-
int main() {
|
14
|
-
ActivateLCDPositioner();
|
15
|
-
}
|
1
|
+
#include "LCDPositioner.h"
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <stdlib.h>
|
4
|
+
|
5
|
+
void Input(int* up, int* down, int* left, int* right, int* pulse10ms) {
|
6
|
+
if (scanf("%d %d %d %d %d", up, down, left, right, pulse10ms) == EOF) {
|
7
|
+
exit(0);
|
8
|
+
}
|
9
|
+
}
|
10
|
+
void Output(int* x, int* y) {
|
11
|
+
printf("%d %d\n", *x, *y);
|
12
|
+
}
|
13
|
+
int main() {
|
14
|
+
ActivateLCDPositioner();
|
15
|
+
}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
NAME = "LCDPositioner"
|
2
|
-
load File.expand_path('../../Rakefile.common', __FILE__)
|
1
|
+
NAME = "LCDPositioner"
|
2
|
+
load File.expand_path('../../Rakefile.common', __FILE__)
|
File without changes
|
File without changes
|
data/tests/compiler/Rakefile
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
task :default do
|
2
|
-
Dir.glob("[a-zA-Z0-9_]*") do |d|
|
3
|
-
Dir.chdir(d) do
|
4
|
-
puts "moved into directory `#{d}'"
|
5
|
-
sh "rake"
|
6
|
-
end if Dir.exist?(d)
|
7
|
-
end
|
8
|
-
end
|
1
|
+
task :default do
|
2
|
+
Dir.glob("[a-zA-Z0-9_]*") do |d|
|
3
|
+
Dir.chdir(d) do
|
4
|
+
puts "moved into directory `#{d}'"
|
5
|
+
sh "rake"
|
6
|
+
end if Dir.exist?(d)
|
7
|
+
end
|
8
|
+
end
|
@@ -1,23 +1,23 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
-
require 'emfrp'
|
3
|
-
|
4
|
-
task :default do
|
5
|
-
begin
|
6
|
-
puts "TESTING #{NAME}".colorize(:light_blue)
|
7
|
-
sh "../../../bin/emfrp #{NAME}.mfrp"
|
8
|
-
sh "cc -c #{NAME}.c"
|
9
|
-
sh "cc -c #{NAME}Main.c"
|
10
|
-
sh "cc #{NAME}.o #{NAME}Main.o -o #{NAME}"
|
11
|
-
sh "./#{NAME} < in.txt > actual_out.txt"
|
12
|
-
sh "rm #{NAME}Main.c.gen"
|
13
|
-
sh "rm #{NAME}.c"
|
14
|
-
sh "rm #{NAME}.h"
|
15
|
-
sh "rm #{NAME}.o"
|
16
|
-
sh "rm #{NAME}Main.o"
|
17
|
-
sh "rm #{NAME}"
|
18
|
-
sh "diff expected_out.txt actual_out.txt -u"
|
19
|
-
puts " => ok".colorize(:green)
|
20
|
-
rescue
|
21
|
-
puts " => fail".colorize(:red)
|
22
|
-
end
|
23
|
-
end
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require 'emfrp'
|
3
|
+
|
4
|
+
task :default do
|
5
|
+
begin
|
6
|
+
puts "TESTING #{NAME}".colorize(:light_blue)
|
7
|
+
sh "../../../bin/emfrp #{NAME}.mfrp"
|
8
|
+
sh "cc -c #{NAME}.c"
|
9
|
+
sh "cc -c #{NAME}Main.c"
|
10
|
+
sh "cc #{NAME}.o #{NAME}Main.o -o #{NAME}"
|
11
|
+
sh "./#{NAME} < in.txt > actual_out.txt"
|
12
|
+
sh "rm #{NAME}Main.c.gen"
|
13
|
+
sh "rm #{NAME}.c"
|
14
|
+
sh "rm #{NAME}.h"
|
15
|
+
sh "rm #{NAME}.o"
|
16
|
+
sh "rm #{NAME}Main.o"
|
17
|
+
sh "rm #{NAME}"
|
18
|
+
sh "diff expected_out.txt actual_out.txt -u"
|
19
|
+
puts " => ok".colorize(:green)
|
20
|
+
rescue
|
21
|
+
puts " => fail".colorize(:red)
|
22
|
+
end
|
23
|
+
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
NAME = "UseData"
|
2
|
-
load File.expand_path('../../Rakefile.common', __FILE__)
|
1
|
+
NAME = "UseData"
|
2
|
+
load File.expand_path('../../Rakefile.common', __FILE__)
|
@@ -1,8 +1,8 @@
|
|
1
|
-
module UseData out x use Std
|
2
|
-
|
3
|
-
|
4
|
-
data one = 1 # one
|
5
|
-
data two = one + 1 # two
|
6
|
-
data three = two + 1 # three
|
7
|
-
|
8
|
-
node x = three
|
1
|
+
module UseData out x use Std
|
2
|
+
|
3
|
+
|
4
|
+
data one = 1 # one
|
5
|
+
data two = one + 1 # two
|
6
|
+
data three = two + 1 # three
|
7
|
+
|
8
|
+
node x = three
|
@@ -1,2 +1,2 @@
|
|
1
|
-
NAME = "UseSubModule"
|
2
|
-
load File.expand_path('../../Rakefile.common', __FILE__)
|
1
|
+
NAME = "UseSubModule"
|
2
|
+
load File.expand_path('../../Rakefile.common', __FILE__)
|
@@ -1,8 +1,8 @@
|
|
1
|
-
module SubModule
|
2
|
-
in i1 : Int, i2 : Int
|
3
|
-
out x, y
|
4
|
-
use Std
|
5
|
-
|
6
|
-
newnode a = SubModule2(i1)
|
7
|
-
node x = a * i2
|
8
|
-
node init[0] y = y@last + i2
|
1
|
+
module SubModule
|
2
|
+
in i1 : Int, i2 : Int
|
3
|
+
out x, y
|
4
|
+
use Std
|
5
|
+
|
6
|
+
newnode a = SubModule2(i1)
|
7
|
+
node x = a * i2
|
8
|
+
node init[0] y = y@last + i2
|
@@ -1,5 +1,5 @@
|
|
1
|
-
module SubModule2
|
2
|
-
in x : Int
|
3
|
-
out y
|
4
|
-
|
5
|
-
node y = x
|
1
|
+
module SubModule2
|
2
|
+
in x : Int
|
3
|
+
out y
|
4
|
+
|
5
|
+
node y = x
|
@@ -1,11 +1,11 @@
|
|
1
|
-
module UseSubModule
|
2
|
-
in x : Int
|
3
|
-
out a1, b1, a2, b2
|
4
|
-
use Std
|
5
|
-
|
6
|
-
newnode a1, b1 = SubModule(x, 2)
|
7
|
-
newnode a2, b2 = SubModule(x + 1, 3)
|
8
|
-
|
9
|
-
#@ :assert-module
|
10
|
-
#- 0 => 0, 2, 3, 3
|
11
|
-
#@ : 1 => 2, 4, 6, 6
|
1
|
+
module UseSubModule
|
2
|
+
in x : Int
|
3
|
+
out a1, b1, a2, b2
|
4
|
+
use Std
|
5
|
+
|
6
|
+
newnode a1, b1 = SubModule(x, 2)
|
7
|
+
newnode a2, b2 = SubModule(x + 1, 3)
|
8
|
+
|
9
|
+
#@ :assert-module
|
10
|
+
#- 0 => 0, 2, 3, 3
|
11
|
+
#@ : 1 => 2, 4, 6, 6
|