emfrp 0.0.1

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.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE +28 -0
  5. data/README.md +27 -0
  6. data/Rakefile +2 -0
  7. data/bin/emfrp +21 -0
  8. data/bin/emfrpi +24 -0
  9. data/emfrp.gemspec +26 -0
  10. data/examples/LCDPositioner/LCDPositioner.c +278 -0
  11. data/examples/LCDPositioner/LCDPositioner.h +6 -0
  12. data/examples/LCDPositioner/LCDPositioner.mfrp +30 -0
  13. data/examples/LCDPositioner/LCDPositionerMain.c +15 -0
  14. data/examples/LCDPositioner/LCDPositionerMain.c.gen +11 -0
  15. data/examples/LCDPositioner/graph.dot +31 -0
  16. data/examples/LCDPositioner/graph.png +0 -0
  17. data/examples/MostDistantPoint/MostDistantPoint.c +199 -0
  18. data/examples/MostDistantPoint/MostDistantPoint.h +6 -0
  19. data/examples/MostDistantPoint/MostDistantPoint.mfrp +25 -0
  20. data/examples/MostDistantPoint/MostDistantPointMain.c +14 -0
  21. data/examples/MostDistantPoint/graph.dot +12 -0
  22. data/examples/MostDistantPoint/graph.png +0 -0
  23. data/lib/emfrp/compile/c/alloc.rb +200 -0
  24. data/lib/emfrp/compile/c/codegen.rb +18 -0
  25. data/lib/emfrp/compile/c/codegen_context.rb +215 -0
  26. data/lib/emfrp/compile/c/monofy.rb +185 -0
  27. data/lib/emfrp/compile/c/syntax_codegen.rb +364 -0
  28. data/lib/emfrp/compile/c/syntax_exp_codegen.rb +119 -0
  29. data/lib/emfrp/compile/graphviz/graphviz.rb +49 -0
  30. data/lib/emfrp/compile_error.rb +95 -0
  31. data/lib/emfrp/interpreter/command_manager.rb +367 -0
  32. data/lib/emfrp/interpreter/evaluater.rb +146 -0
  33. data/lib/emfrp/interpreter/file_loader.rb +52 -0
  34. data/lib/emfrp/interpreter/interpreter.rb +195 -0
  35. data/lib/emfrp/parser/expression.rb +386 -0
  36. data/lib/emfrp/parser/misc.rb +184 -0
  37. data/lib/emfrp/parser/operator.rb +25 -0
  38. data/lib/emfrp/parser/parser.rb +145 -0
  39. data/lib/emfrp/parser/parsing_error.rb +49 -0
  40. data/lib/emfrp/parser/toplevel.rb +523 -0
  41. data/lib/emfrp/pre_convert/alpha_convert.rb +119 -0
  42. data/lib/emfrp/pre_convert/make_name_dict.rb +96 -0
  43. data/lib/emfrp/pre_convert/node_check.rb +60 -0
  44. data/lib/emfrp/pre_convert/pre_convert.rb +32 -0
  45. data/lib/emfrp/syntax.rb +169 -0
  46. data/lib/emfrp/typing/typing.rb +256 -0
  47. data/lib/emfrp/typing/typing_error.rb +47 -0
  48. data/lib/emfrp/typing/union_type.rb +197 -0
  49. data/lib/emfrp/version.rb +3 -0
  50. data/lib/emfrp.rb +14 -0
  51. data/mfrp_include/Std.mfrp +122 -0
  52. data/tests/Rakefile +8 -0
  53. data/tests/Rakefile.common +27 -0
  54. data/tests/command/Rakefile +2 -0
  55. data/tests/command/ReplaceNode.mfrp +39 -0
  56. data/tests/compiler/ComplexDataType/ComplexDataType.mfrp +14 -0
  57. data/tests/compiler/ComplexDataType/ComplexDataTypeMain.c +15 -0
  58. data/tests/compiler/ComplexDataType/Rakefile +2 -0
  59. data/tests/compiler/ComplexDataType/actual_out.txt +5 -0
  60. data/tests/compiler/ComplexDataType/expected_out.txt +5 -0
  61. data/tests/compiler/ComplexDataType/graph.png +0 -0
  62. data/tests/compiler/ComplexDataType/in.txt +5 -0
  63. data/tests/compiler/LCDPositioner/LCDPositioner.mfrp +30 -0
  64. data/tests/compiler/LCDPositioner/LCDPositionerMain.c +15 -0
  65. data/tests/compiler/LCDPositioner/Rakefile +2 -0
  66. data/tests/compiler/LCDPositioner/actual_out.txt +9 -0
  67. data/tests/compiler/LCDPositioner/expected_out.txt +9 -0
  68. data/tests/compiler/LCDPositioner/graph.dot +31 -0
  69. data/tests/compiler/LCDPositioner/graph.png +0 -0
  70. data/tests/compiler/LCDPositioner/in.txt +11 -0
  71. data/tests/compiler/Rakefile +8 -0
  72. data/tests/compiler/Rakefile.common +23 -0
  73. data/tests/core/FromAnnotation.mfrp +18 -0
  74. data/tests/core/Last.mfrp +10 -0
  75. data/tests/core/Rakefile +2 -0
  76. data/tests/core/TypingTest.mfrp +11 -0
  77. data/tests/core/WithoutInputs.mfrp +19 -0
  78. data/tests/load_time_error/Rakefile +32 -0
  79. data/tests/load_time_error/TypeMismatch.mfrp +4 -0
  80. metadata +180 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 739151824444ba84586ec87772d5cbb30bb2157c
4
+ data.tar.gz: 76b48e983b31abd5459cea456f68976af359fa0f
5
+ SHA512:
6
+ metadata.gz: 1b77eb4ab6596bcb41269a2b72fc22ad28b8137895c604ef013e0b7047677698b2bce41396c5b84eb0f535fdb5de6c9447773f4e66d953b21702a838c79e8de3
7
+ data.tar.gz: 73353f055c801bb8b2841651137b75112f1f96c94b93ffe2979c3e7a8a4eaadb36a7727ca3f65a494a3ab7c3fcbdd71b9af34a95a8025628a894751970dcff60
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in emfrp.gemspec
4
+ gemspec
5
+ colorize
6
+ parser_combinator
data/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ Copyright (c) 2015, Kensuke Sawada
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+
14
+ 3. Neither the name of the copyright holder nor the names of its
15
+ contributors may be used to endorse or promote products derived from
16
+ this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22
+ COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # Emfrp
2
+
3
+ Pure Functional Programming with your microcomputer.
4
+
5
+ # Requirement
6
+
7
+ * Ruby2.0 or later (and it's Gem client)
8
+
9
+ ## Installation
10
+ You can get executables via RubyGems.
11
+ ```sh
12
+ $ gem install emfrp
13
+ ```
14
+
15
+ # Command-line-interpreter (REPL)
16
+ ```sh
17
+ $ emfrpi
18
+ ```
19
+
20
+ # Compiler
21
+ ```sh
22
+ $ emfrp <src-file>
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ In prepraration...
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/bin/emfrp ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+
4
+ require 'emfrp'
5
+
6
+ unless ARGV[0]
7
+ puts "usage: emfrp <emfrp-module-file-path>"
8
+ exit(1)
9
+ end
10
+
11
+ begin
12
+ inter = Emfrp::Interpreter.new(Emfrp::IncludeDirs, STDOUT, ARGV[0])
13
+ if inter.compile_default()
14
+ exit(1)
15
+ end
16
+ rescue Emfrp::Interpreter::InterpreterError
17
+ exit(1)
18
+ rescue Emfrp::FileLoader::FileLoadError => err
19
+ puts err.message
20
+ exit(1)
21
+ end
data/bin/emfrpi ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+
4
+ require 'emfrp'
5
+ require 'readline'
6
+
7
+ begin
8
+ inter = Emfrp::Interpreter.new(Emfrp::IncludeDirs, STDOUT, ARGV[0] || "Std")
9
+ Readline.completion_proc = inter.completion_proc
10
+ while true
11
+ input = Readline.readline("emfrpi:#{inter.current_readline_id}> ", true)
12
+ if input == nil
13
+ inter.close()
14
+ exit(0)
15
+ else
16
+ inter.process_repl_line(input)
17
+ end
18
+ end
19
+ rescue Emfrp::Interpreter::InterpreterError
20
+ exit(1)
21
+ rescue Emfrp::FileLoader::FileLoadError => err
22
+ puts err.message
23
+ exit(1)
24
+ end
data/emfrp.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'emfrp/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "emfrp"
8
+ spec.version = Emfrp::VERSION
9
+ spec.authors = ["Kensuke Sawada"]
10
+ spec.email = ["sasasawada@gmail.com"]
11
+ spec.summary = %q{A compier of Emfrp, a FRP language for small embeded systems.}
12
+ spec.description = %q{Pure Functional Programming with your microcomputer.}
13
+ spec.homepage = ""
14
+ spec.license = "The BSD 3-Clause License"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "colorize", ">= 0.7.7"
22
+ spec.add_dependency "parser_combinator", ">= 0.0.3"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.7"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ end
@@ -0,0 +1,278 @@
1
+ #include "LCDPositioner.h"
2
+ /* Primitive functions (Macros) */
3
+ #define _plus_(a, b) (a + b)
4
+ #define _anpersand_anpersand(a, b) (a && b)
5
+ #define _eq__eq_(a, b) (a == b)
6
+ #define _parcent_(a, b) (a % b)
7
+ #define boolToInt(a) (a)
8
+ #define _minus_(a, b) (a - b)
9
+ /* Data types */
10
+ struct Tuple2_Int_Int{
11
+ int mark;
12
+ union {
13
+ struct {
14
+ int member0;
15
+ int member1;
16
+ }Tuple2;
17
+ }value;
18
+ };
19
+ struct Tuple2_Bool_Int{
20
+ int mark;
21
+ union {
22
+ struct {
23
+ int member0;
24
+ int member1;
25
+ }Tuple2;
26
+ }value;
27
+ };
28
+ /* Global variables */
29
+ int node_memory_up[2];
30
+ int node_memory_down[2];
31
+ int node_memory_left[2];
32
+ int node_memory_right[2];
33
+ int node_memory_pulse10ms[2];
34
+ struct Tuple2_Bool_Int* node_memory_k[2];
35
+ int node_memory_dx[2];
36
+ int node_memory_dy[2];
37
+ int node_memory_pulse40ms[2];
38
+ int node_memory_pulse40msCount[2];
39
+ struct Tuple2_Int_Int* node_memory_pos[2];
40
+ int node_memory_x[2];
41
+ int node_memory_y[2];
42
+ struct Tuple2_Bool_Int memory_Tuple2_Bool_Int[2];
43
+ int size_Tuple2_Bool_Int = 2;
44
+ int counter_Tuple2_Bool_Int = 0;
45
+ struct Tuple2_Int_Int memory_Tuple2_Int_Int[2];
46
+ int size_Tuple2_Int_Int = 2;
47
+ int counter_Tuple2_Int_Int = 0;
48
+ int Counter = 1;
49
+ int NodeSize = 8;
50
+ /* Static prototypes */
51
+ static struct Tuple2_Int_Int* Tuple2_0(int, int);
52
+ static void mark_Tuple2_Int_Int(struct Tuple2_Int_Int*, int);
53
+ static struct Tuple2_Bool_Int* Tuple2_1(int, int);
54
+ static void mark_Tuple2_Bool_Int(struct Tuple2_Bool_Int*, int);
55
+ static int node_k(int, int, struct Tuple2_Bool_Int**);
56
+ static struct Tuple2_Bool_Int* init_k();
57
+ static int node_dx(int, int, int*);
58
+ static int node_dy(int, int, int*);
59
+ static int node_pulse40ms(struct Tuple2_Bool_Int*, int*);
60
+ static int init_pulse40ms();
61
+ static int node_pulse40msCount(struct Tuple2_Bool_Int*, int*);
62
+ static int init_pulse40msCount();
63
+ static int node_pos(int, int, int, int, int, struct Tuple2_Int_Int*, struct Tuple2_Int_Int**);
64
+ static struct Tuple2_Int_Int* init_pos();
65
+ static int node_x(struct Tuple2_Int_Int*, int*);
66
+ static int init_x();
67
+ static int node_y(struct Tuple2_Int_Int*, int*);
68
+ static int init_y();
69
+ static void refreshMark();
70
+ extern void Input(int*, int*, int*, int*, int*);
71
+ extern void Output(int*, int*);
72
+ /* Functions, Constructors, GCMarkers, etc... */
73
+ static struct Tuple2_Int_Int* Tuple2_0(int member0, int member1) {
74
+ struct Tuple2_Int_Int* x;
75
+ while (1) {
76
+ counter_Tuple2_Int_Int++;
77
+ counter_Tuple2_Int_Int %= size_Tuple2_Int_Int;
78
+ if (memory_Tuple2_Int_Int[counter_Tuple2_Int_Int].mark < Counter) { x = memory_Tuple2_Int_Int + counter_Tuple2_Int_Int; break; }
79
+ }
80
+ x->value.Tuple2.member0 = member0;
81
+ x->value.Tuple2.member1 = member1;
82
+ return x;
83
+ }
84
+ static void mark_Tuple2_Int_Int(struct Tuple2_Int_Int* x, int mark) {
85
+ x->mark = mark;
86
+ }
87
+ static struct Tuple2_Bool_Int* Tuple2_1(int member0, int member1) {
88
+ struct Tuple2_Bool_Int* x;
89
+ while (1) {
90
+ counter_Tuple2_Bool_Int++;
91
+ counter_Tuple2_Bool_Int %= size_Tuple2_Bool_Int;
92
+ if (memory_Tuple2_Bool_Int[counter_Tuple2_Bool_Int].mark < Counter) { x = memory_Tuple2_Bool_Int + counter_Tuple2_Bool_Int; break; }
93
+ }
94
+ x->value.Tuple2.member0 = member0;
95
+ x->value.Tuple2.member1 = member1;
96
+ return x;
97
+ }
98
+ static void mark_Tuple2_Bool_Int(struct Tuple2_Bool_Int* x, int mark) {
99
+ x->mark = mark;
100
+ }
101
+ static int node_k(int pulse10ms, int pulse40msCount_at_last, struct Tuple2_Bool_Int** output) {
102
+ int _tmp001;
103
+ struct Tuple2_Bool_Int* _tmp000;
104
+ _tmp001 = _parcent_(_plus_(pulse40msCount_at_last, boolToInt(pulse10ms)), 4);
105
+ if (1) {
106
+ int pvar0_c = _tmp001;
107
+ _tmp000 = Tuple2_1(_anpersand_anpersand(_eq__eq_(pvar0_c, 0), pulse10ms), pvar0_c);
108
+ }
109
+ *output = _tmp000;
110
+ return 1;
111
+ }
112
+ static struct Tuple2_Bool_Int* init_k() {
113
+ return Tuple2_1(0, 0);
114
+ }
115
+ static int node_dx(int right, int left, int* output) {
116
+ *output = _minus_(boolToInt(right), boolToInt(left));
117
+ return 1;
118
+ }
119
+ static int node_dy(int down, int up, int* output) {
120
+ *output = _minus_(boolToInt(down), boolToInt(up));
121
+ return 1;
122
+ }
123
+ static int node_pulse40ms(struct Tuple2_Bool_Int* k, int* output) {
124
+ int _tmp002;
125
+ if (1) {
126
+ struct Tuple2_Bool_Int* pvar1_k = k;
127
+ int pvar1_pulse40ms = k->value.Tuple2.member0;
128
+ int pvar1_pulse40msCount = k->value.Tuple2.member1;
129
+ _tmp002 = pvar1_pulse40ms;
130
+ }
131
+ *output = _tmp002;
132
+ return 1;
133
+ }
134
+ static int init_pulse40ms() {
135
+ struct Tuple2_Bool_Int* _tmp004;
136
+ int _tmp003;
137
+ _tmp004 = Tuple2_1(0, 0);
138
+ if (1) {
139
+ struct Tuple2_Bool_Int* pvar2_k = _tmp004;
140
+ int pvar2_pulse40ms = _tmp004->value.Tuple2.member0;
141
+ int pvar2_pulse40msCount = _tmp004->value.Tuple2.member1;
142
+ _tmp003 = pvar2_pulse40ms;
143
+ }
144
+ return _tmp003;
145
+ }
146
+ static int node_pulse40msCount(struct Tuple2_Bool_Int* k, int* output) {
147
+ int _tmp005;
148
+ if (1) {
149
+ struct Tuple2_Bool_Int* pvar3_k = k;
150
+ int pvar3_pulse40ms = k->value.Tuple2.member0;
151
+ int pvar3_pulse40msCount = k->value.Tuple2.member1;
152
+ _tmp005 = pvar3_pulse40msCount;
153
+ }
154
+ *output = _tmp005;
155
+ return 1;
156
+ }
157
+ static int init_pulse40msCount() {
158
+ struct Tuple2_Bool_Int* _tmp007;
159
+ int _tmp006;
160
+ _tmp007 = Tuple2_1(0, 0);
161
+ if (1) {
162
+ struct Tuple2_Bool_Int* pvar4_k = _tmp007;
163
+ int pvar4_pulse40ms = _tmp007->value.Tuple2.member0;
164
+ int pvar4_pulse40msCount = _tmp007->value.Tuple2.member1;
165
+ _tmp006 = pvar4_pulse40msCount;
166
+ }
167
+ return _tmp006;
168
+ }
169
+ static int node_pos(int pulse40ms, int x_at_last, int dx, int y_at_last, int dy, struct Tuple2_Int_Int* pos_at_last, struct Tuple2_Int_Int** output) {
170
+ struct Tuple2_Int_Int* _tmp008;
171
+ if (pulse40ms == 1) {
172
+ _tmp008 = Tuple2_0(_plus_(x_at_last, dx), _plus_(y_at_last, dy));
173
+ }
174
+ else if (pulse40ms == 0) {
175
+ _tmp008 = pos_at_last;
176
+ }
177
+ *output = _tmp008;
178
+ return 1;
179
+ }
180
+ static struct Tuple2_Int_Int* init_pos() {
181
+ return Tuple2_0(0, 0);
182
+ }
183
+ static int node_x(struct Tuple2_Int_Int* pos, int* output) {
184
+ int _tmp009;
185
+ if (1) {
186
+ struct Tuple2_Int_Int* pvar5_pos = pos;
187
+ int pvar5_x = pos->value.Tuple2.member0;
188
+ int pvar5_y = pos->value.Tuple2.member1;
189
+ _tmp009 = pvar5_x;
190
+ }
191
+ *output = _tmp009;
192
+ return 1;
193
+ }
194
+ static int init_x() {
195
+ struct Tuple2_Int_Int* _tmp011;
196
+ int _tmp010;
197
+ _tmp011 = Tuple2_0(0, 0);
198
+ if (1) {
199
+ struct Tuple2_Int_Int* pvar6_pos = _tmp011;
200
+ int pvar6_x = _tmp011->value.Tuple2.member0;
201
+ int pvar6_y = _tmp011->value.Tuple2.member1;
202
+ _tmp010 = pvar6_x;
203
+ }
204
+ return _tmp010;
205
+ }
206
+ static int node_y(struct Tuple2_Int_Int* pos, int* output) {
207
+ int _tmp012;
208
+ if (1) {
209
+ struct Tuple2_Int_Int* pvar7_pos = pos;
210
+ int pvar7_x = pos->value.Tuple2.member0;
211
+ int pvar7_y = pos->value.Tuple2.member1;
212
+ _tmp012 = pvar7_y;
213
+ }
214
+ *output = _tmp012;
215
+ return 1;
216
+ }
217
+ static int init_y() {
218
+ struct Tuple2_Int_Int* _tmp014;
219
+ int _tmp013;
220
+ _tmp014 = Tuple2_0(0, 0);
221
+ if (1) {
222
+ struct Tuple2_Int_Int* pvar8_pos = _tmp014;
223
+ int pvar8_x = _tmp014->value.Tuple2.member0;
224
+ int pvar8_y = _tmp014->value.Tuple2.member1;
225
+ _tmp013 = pvar8_y;
226
+ }
227
+ return _tmp013;
228
+ }
229
+ static void refreshMark() {
230
+ int i;
231
+ for (i = 0; i < size_Tuple2_Bool_Int; i++) {
232
+ if (memory_Tuple2_Bool_Int[i].mark < Counter) memory_Tuple2_Bool_Int[i].mark = 0;
233
+ else memory_Tuple2_Bool_Int[i].mark -= Counter - 1;
234
+ }
235
+ for (i = 0; i < size_Tuple2_Int_Int; i++) {
236
+ if (memory_Tuple2_Int_Int[i].mark < Counter) memory_Tuple2_Int_Int[i].mark = 0;
237
+ else memory_Tuple2_Int_Int[i].mark -= Counter - 1;
238
+ }
239
+ }
240
+ void ActivateLCDPositioner() {
241
+ int current_side = 0, last_side = 1;
242
+ node_memory_k[last_side] = init_k();
243
+ mark_Tuple2_Bool_Int(node_memory_k[last_side], 0);
244
+ node_memory_pulse40ms[last_side] = init_pulse40ms();
245
+ node_memory_pulse40msCount[last_side] = init_pulse40msCount();
246
+ node_memory_pos[last_side] = init_pos();
247
+ mark_Tuple2_Int_Int(node_memory_pos[last_side], 6);
248
+ node_memory_x[last_side] = init_x();
249
+ node_memory_y[last_side] = init_y();
250
+ Counter = NodeSize + 1;
251
+ refreshMark();
252
+ while (1) {
253
+ Counter = 1;
254
+ Input(&node_memory_up[current_side], &node_memory_down[current_side], &node_memory_left[current_side], &node_memory_right[current_side], &node_memory_pulse10ms[current_side]);
255
+ node_k(node_memory_pulse10ms[current_side], node_memory_pulse40msCount[last_side], &node_memory_k[current_side]);
256
+ mark_Tuple2_Bool_Int(node_memory_k[current_side], Counter + 4);
257
+ Counter++;
258
+ node_dx(node_memory_right[current_side], node_memory_left[current_side], &node_memory_dx[current_side]);
259
+ Counter++;
260
+ node_dy(node_memory_down[current_side], node_memory_up[current_side], &node_memory_dy[current_side]);
261
+ Counter++;
262
+ node_pulse40ms(node_memory_k[current_side], &node_memory_pulse40ms[current_side]);
263
+ Counter++;
264
+ node_pulse40msCount(node_memory_k[current_side], &node_memory_pulse40msCount[current_side]);
265
+ Counter++;
266
+ node_pos(node_memory_pulse40ms[current_side], node_memory_x[last_side], node_memory_dx[current_side], node_memory_y[last_side], node_memory_dy[current_side], node_memory_pos[last_side], &node_memory_pos[current_side]);
267
+ mark_Tuple2_Int_Int(node_memory_pos[current_side], Counter + 8);
268
+ Counter++;
269
+ node_x(node_memory_pos[current_side], &node_memory_x[current_side]);
270
+ Counter++;
271
+ node_y(node_memory_pos[current_side], &node_memory_y[current_side]);
272
+ Counter++;
273
+ Output(&node_memory_x[current_side], &node_memory_y[current_side]);
274
+ refreshMark();
275
+ current_side ^= 1;
276
+ last_side ^= 1;
277
+ }
278
+ }
@@ -0,0 +1,6 @@
1
+ #ifndef LCDPOSITIONER_H
2
+ #define LCDPOSITIONER_H
3
+
4
+ void ActivateLCDPositioner();
5
+
6
+ #endif /* end of include guard */
@@ -0,0 +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
@@ -0,0 +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
+ }
@@ -0,0 +1,11 @@
1
+ #include "LCDPositioner.h"
2
+
3
+ void Input(int* up, int* down, int* left, int* right, int* pulse10ms) {
4
+ /* Your code goes here... */
5
+ }
6
+ void Output(int* x, int* y) {
7
+ /* Your code goes here... */
8
+ }
9
+ int main() {
10
+ ActivateLCDPositioner();
11
+ }
@@ -0,0 +1,31 @@
1
+ digraph LCDPositioner {
2
+ pulse10ms [label = "pulse10ms : Bool", shape = "invhouse"];
3
+ pulse40msCount [label = "pulse40msCount : Int"];
4
+ pulse [label = "pulse : Tuple2[Bool, Int]"];
5
+ pulse40ms [label = "pulse40ms : Bool"];
6
+ right [label = "right : Bool", shape = "invhouse"];
7
+ left [label = "left : Bool", shape = "invhouse"];
8
+ dx [label = "dx : Int"];
9
+ y [label = "y : Int", style = filled, fillcolor = "#e4e4e4"];
10
+ down [label = "down : Bool", shape = "invhouse"];
11
+ up [label = "up : Bool", shape = "invhouse"];
12
+ dy [label = "dy : Int"];
13
+ pos [label = "pos : Tuple2[Int, Int]"];
14
+ x [label = "x : Int", style = filled, fillcolor = "#e4e4e4"];
15
+ pos -> x;
16
+ pulse40ms -> pos;
17
+ pulse -> pulse40ms;
18
+ pulse10ms -> pulse;
19
+ pulse40msCount -> pulse [style = dashed];
20
+ pulse -> pulse40msCount;
21
+ x -> pos [style = dashed];
22
+ dx -> pos;
23
+ right -> dx;
24
+ left -> dx;
25
+ y -> pos [style = dashed];
26
+ pos -> y;
27
+ dy -> pos;
28
+ down -> dy;
29
+ up -> dy;
30
+ pos -> pos [style = dashed];
31
+ }
Binary file