sfrp 1.1.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.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/.ctags +3 -0
  3. data/.editorconfig +9 -0
  4. data/.gitignore +14 -0
  5. data/.rubocop.yml +629 -0
  6. data/.travis.yml +12 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE +28 -0
  9. data/README.md +34 -0
  10. data/Rakefile +1 -0
  11. data/base-library/Base.sfrp +81 -0
  12. data/base-library/IO/AVR/ATMEGA8.c +9 -0
  13. data/base-library/IO/AVR/ATMEGA8.h +6 -0
  14. data/base-library/IO/AVR/ATMEGA8.sfrp +4 -0
  15. data/base-library/IO/STDIO.c +40 -0
  16. data/base-library/IO/STDIO.h +13 -0
  17. data/base-library/IO/STDIO.sfrp +10 -0
  18. data/bin/sfrp +7 -0
  19. data/lib/sfrp.rb +2 -0
  20. data/lib/sfrp/command.rb +73 -0
  21. data/lib/sfrp/compiler.rb +94 -0
  22. data/lib/sfrp/error.rb +4 -0
  23. data/lib/sfrp/file.rb +18 -0
  24. data/lib/sfrp/flat/dsl.rb +33 -0
  25. data/lib/sfrp/flat/elements.rb +90 -0
  26. data/lib/sfrp/flat/exception.rb +45 -0
  27. data/lib/sfrp/flat/expression.rb +125 -0
  28. data/lib/sfrp/flat/set.rb +61 -0
  29. data/lib/sfrp/input/exception.rb +16 -0
  30. data/lib/sfrp/input/parser.rb +417 -0
  31. data/lib/sfrp/input/set.rb +29 -0
  32. data/lib/sfrp/input/transformer.rb +219 -0
  33. data/lib/sfrp/low/dsl.rb +126 -0
  34. data/lib/sfrp/low/element.rb +126 -0
  35. data/lib/sfrp/low/set.rb +62 -0
  36. data/lib/sfrp/mono/dsl.rb +120 -0
  37. data/lib/sfrp/mono/environment.rb +26 -0
  38. data/lib/sfrp/mono/exception.rb +21 -0
  39. data/lib/sfrp/mono/expression.rb +124 -0
  40. data/lib/sfrp/mono/function.rb +86 -0
  41. data/lib/sfrp/mono/memory.rb +32 -0
  42. data/lib/sfrp/mono/node.rb +125 -0
  43. data/lib/sfrp/mono/pattern.rb +69 -0
  44. data/lib/sfrp/mono/set.rb +151 -0
  45. data/lib/sfrp/mono/type.rb +210 -0
  46. data/lib/sfrp/mono/vconst.rb +134 -0
  47. data/lib/sfrp/output/set.rb +33 -0
  48. data/lib/sfrp/poly/dsl.rb +171 -0
  49. data/lib/sfrp/poly/elements.rb +168 -0
  50. data/lib/sfrp/poly/exception.rb +42 -0
  51. data/lib/sfrp/poly/expression.rb +170 -0
  52. data/lib/sfrp/poly/monofier.rb +73 -0
  53. data/lib/sfrp/poly/set.rb +90 -0
  54. data/lib/sfrp/poly/typing.rb +197 -0
  55. data/lib/sfrp/raw/dsl.rb +41 -0
  56. data/lib/sfrp/raw/elements.rb +164 -0
  57. data/lib/sfrp/raw/exception.rb +40 -0
  58. data/lib/sfrp/raw/expression.rb +168 -0
  59. data/lib/sfrp/raw/namespace.rb +30 -0
  60. data/lib/sfrp/raw/set.rb +109 -0
  61. data/lib/sfrp/version.rb +3 -0
  62. data/sfrp.gemspec +40 -0
  63. data/spec/sfrp/Test.sfrp +4 -0
  64. data/spec/sfrp/compiler_spec.rb +17 -0
  65. data/spec/sfrp/flat/set_spec.rb +40 -0
  66. data/spec/sfrp/input/parse_test.sfrp +20 -0
  67. data/spec/sfrp/input/set_spec.rb +18 -0
  68. data/spec/sfrp/low/set_spec.rb +20 -0
  69. data/spec/sfrp/mono/expected.yml +295 -0
  70. data/spec/sfrp/mono/set_spec.rb +152 -0
  71. data/spec/sfrp/output/set_spec.rb +29 -0
  72. data/spec/sfrp/poly/set_spec.rb +290 -0
  73. data/spec/sfrp/raw/set_spec.rb +38 -0
  74. data/spec/spec_helper.rb +16 -0
  75. data/test/IntTest/Main.c +5 -0
  76. data/test/IntTest/Main.h +6 -0
  77. data/test/IntTest/Main.sfrp +10 -0
  78. data/test/IntTest/in.txt +3 -0
  79. data/test/IntTest/out.txt +4 -0
  80. data/test/MaybeTest/Main.sfrp +8 -0
  81. data/test/MaybeTest/SubDir/Lib.sfrp +9 -0
  82. data/test/MaybeTest/in.txt +6 -0
  83. data/test/MaybeTest/out.txt +6 -0
  84. data/test/Rakefile +15 -0
  85. metadata +290 -0
@@ -0,0 +1,109 @@
1
+ require 'sfrp/raw/elements'
2
+ require 'sfrp/raw/exception'
3
+ require 'sfrp/raw/expression'
4
+ require 'sfrp/raw/namespace'
5
+ require 'sfrp/raw/dsl'
6
+
7
+ module SFRP
8
+ module Raw
9
+ class Set
10
+ def initialize(&block)
11
+ @infixies = []
12
+ @inits = []
13
+ @prim_tconsts = []
14
+ @output_node_strs = []
15
+ @vconst_h = {}
16
+ @func_h = {}
17
+ @tconst_h = {}
18
+ @node_h = {}
19
+ block.call(self) if block
20
+ vconst_refs.each { |vr| append_literal_vconst(vr.relative_name) }
21
+ end
22
+
23
+ def to_flat
24
+ Flat::Set.new do |dest_set|
25
+ [
26
+ @func_h, @tconst_h, @vconst_h, @node_h
27
+ ].flat_map(&:values).each { |e| e.gen_flat(self, dest_set) }
28
+ @inits.each { |i| i.gen_flat(self, dest_set) }
29
+ @output_node_strs.each { |s| dest_set.append_output_node_str(s) }
30
+ end
31
+ end
32
+
33
+ def <<(element)
34
+ case element
35
+ when Function
36
+ @func_h[element.absolute_name] = element
37
+ when TConst
38
+ @tconst_h[element.absolute_name] = element
39
+ element.vconsts.each { |v| @vconst_h[v.absolute_name] = v }
40
+ when PrimTConst
41
+ @tconst_h[element.absolute_name] = element
42
+ @prim_tconsts << element
43
+ when Node
44
+ @node_h[element.absolute_name] = element
45
+ when Output
46
+ self << element.convert
47
+ @output_node_strs << element.absolute_name
48
+ when Input
49
+ self << element.convert
50
+ when Infix
51
+ @infixies << element
52
+ when Init
53
+ @inits << element
54
+ else
55
+ raise
56
+ end
57
+ end
58
+
59
+ def weakest_op_position(ns, func_refs, sp)
60
+ ab_func_names = func_refs.map { |fr| func(ns, fr, sp).absolute_name }
61
+ infix_h = Hash[@infixies.map { |i| [i.absolute_func_name(self), i] }]
62
+ ab_func_names.each_with_index.map do |x, idx|
63
+ [(infix_h.key?(x) ? infix_h[x].absolute_priority(idx) : [0, 0]), idx]
64
+ end.min[1]
65
+ end
66
+
67
+ def func(ns, func_ref, sp)
68
+ resolve(ns, func_ref, @func_h, sp)
69
+ end
70
+
71
+ def vconst(ns, vconst_ref, sp)
72
+ resolve(ns, vconst_ref, @vconst_h, sp)
73
+ end
74
+
75
+ def node(ns, node_ref, sp)
76
+ resolve(ns, node_ref, @node_h, sp)
77
+ end
78
+
79
+ def tconst(ns, tconst_ref, sp)
80
+ resolve(ns, tconst_ref, @tconst_h, sp)
81
+ end
82
+
83
+ private
84
+
85
+ def resolve(ns, ref, hash, sp)
86
+ hits = ns.search_for_absolute_names(ref).select { |x| hash.key?(x) }
87
+ raise NameError.new(ref.to_s, sp) if hits.empty?
88
+ raise AmbiguousNameError.new(ref.to_s, hits, sp) if hits.size > 1
89
+ hash[hits[0]]
90
+ end
91
+
92
+ def vconst_refs
93
+ elements = [@func_h, @node_h].flat_map(&:values)
94
+ elements.flat_map(&:vconst_refs)
95
+ end
96
+
97
+ def append_literal_vconst(str)
98
+ return unless str =~ /^[0-9].*/
99
+ @prim_tconsts.each do |prim_tconst|
100
+ next unless prim_tconst.vconst_match?(str)
101
+ new_vconst = prim_tconst.make_vconst(str)
102
+ unless @vconst_h.key?(new_vconst.absolute_name)
103
+ @vconst_h[new_vconst.absolute_name] = new_vconst
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,3 @@
1
+ module SFRP
2
+ VERSION = '1.1.0'
3
+ end
data/sfrp.gemspec ADDED
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sfrp/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sfrp"
8
+ spec.version = SFRP::VERSION
9
+ spec.authors = ["Kensuke Sawada"]
10
+ spec.email = ["sasasawada@gmail.com"]
11
+ spec.summary =
12
+ %q{Compiler of a pure functional language for microcontrollers.}
13
+ spec.description = %q{Pure Functional Language for microcontrollers.}
14
+ spec.homepage = "https://github.com/sfrp/sfrp"
15
+ spec.license = "The BSD 3-Clause License"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.7"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+
25
+ # testing
26
+ spec.add_development_dependency 'rspec', '~> 3.0'
27
+ spec.add_development_dependency 'simplecov'
28
+ spec.add_development_dependency 'coveralls'
29
+
30
+ # code analyzing
31
+ spec.add_development_dependency 'rubocop', '0.40.0'
32
+
33
+ # debugging
34
+ spec.add_development_dependency 'pry-byebug'
35
+ spec.add_development_dependency 'tapp'
36
+ spec.add_development_dependency 'awesome_print'
37
+
38
+ # parsing
39
+ spec.add_dependency "parslet", "1.7.1"
40
+ end
@@ -0,0 +1,4 @@
1
+ type Unit = Unit
2
+ $nop(x) = Unit
3
+ @unit(Unit) = @@unit
4
+ out $nop(@unit)
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ require 'sfrp/compiler'
3
+
4
+ module SFRP
5
+ describe 'Compiler' do
6
+ let(:compiler) do
7
+ Compiler.new('Test', [File.dirname(__FILE__)])
8
+ end
9
+
10
+ it 'compiles .sfrp to .c' do
11
+ Dir.mktmpdir do |dirpath|
12
+ compiler.compile(dirpath)
13
+ # puts out = File.read(dirpath + '/main.c')
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require 'sfrp/flat/set'
3
+ require 'sfrp/poly/set'
4
+
5
+ module SFRP
6
+ describe 'Compiled Poly-Set from Flat-Set' do
7
+ let(:pset) do
8
+ Flat::Set.new do |s|
9
+
10
+ s << begin
11
+ exp = F.nr_e('b', false)
12
+ init_exp = F.call_e('init', [])
13
+ Flat::Node.new('a', F.tv('a'), exp, init_exp)
14
+ end
15
+
16
+ s << begin
17
+ exp = F.call_e('ff', [])
18
+ Flat::Node.new('b', F.tv('a'), exp, nil)
19
+ end
20
+
21
+ s << begin
22
+ int = F.t('Int', [])
23
+ exp = F.vc_call_e('1', [])
24
+ Flat::Function.new('init', int, [], [], exp, nil)
25
+ end
26
+
27
+ s << begin
28
+ int = F.t('Int', [])
29
+ Flat::Function.new('ff', int, [], [], nil, 'ff')
30
+ end
31
+
32
+ s.append_output_node_str('a')
33
+ end.to_poly
34
+ end
35
+
36
+ it 'is compiled correctly' do
37
+ pset # TODO wirte assertion
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,20 @@
1
+ import Somewhere.Something as X
2
+
3
+ ptype Int{int} = /^([0-9]+)$/\1/
4
+ ptype Bool{int} = True{1} | False{0}
5
+ type Maybe[a] = Just(a) | Nothing
6
+
7
+ foreign + as +(Int, Int):Int
8
+ infixl + 7
9
+
10
+ foreign - as '-(Int) : Int
11
+
12
+ init PIC.$init(0, 1)
13
+
14
+ f(x, y) = let t = (p, p) where p = (x, y)
15
+ i = 100
16
+ in (t, i)
17
+
18
+ in @pin False from $pin(0)
19
+ @acc 0 = @@acc + - - 1
20
+ out $world(@pin, @acc)
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'sfrp/input/set'
3
+ require 'sfrp/raw/set'
4
+
5
+ module SFRP
6
+ describe 'Compiled Raw-Set from Input-Set' do
7
+ let(:test_program) do
8
+ File.open(File.expand_path('../parse_test.sfrp', __FILE__), 'r', &:read)
9
+ end
10
+ let(:parser) do
11
+ Input::Parser::Parser.new
12
+ end
13
+
14
+ it 'is valid' do
15
+ expect(parser).to parse(test_program)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ require 'sfrp/low/set'
3
+ require 'sfrp/output/set'
4
+
5
+ module SFRP
6
+ describe 'Compiled Output-Set from Low-Set' do
7
+ let(:oset) do
8
+ set = Low::Set.new do |s|
9
+ s << L.include_ab('hoge.h')
10
+ end
11
+ set.to_output
12
+ end
13
+
14
+ it 'has virtual_files' do
15
+ expect(oset.virtual_files).to contain_exactly(
16
+ VirtualFile.new('main', 'c', '#include <hoge.h>'),
17
+ )
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,295 @@
1
+ includes: []
2
+
3
+ macros: []
4
+
5
+ typedefs:
6
+ - typedef struct MaybeInt* MaybeInt;
7
+ - typedef struct Pair* Pair;
8
+ - typedef struct X* X;
9
+ - typedef struct XX* XX;
10
+ - typedef struct STupleIntInt STupleIntInt;
11
+
12
+ structs:
13
+ - >
14
+ struct MaybeInt {
15
+ struct {
16
+ unsigned char term_id : 7;
17
+ unsigned char mark : 1;
18
+ } meta;
19
+ union {
20
+ struct {
21
+ int member0;
22
+ } term0;
23
+ struct {
24
+ } term1;
25
+ } terms;
26
+ };
27
+
28
+ - >
29
+ struct Pair {
30
+ struct {
31
+ unsigned char term_id : 7;
32
+ unsigned char mark : 1;
33
+ } meta;
34
+ union {
35
+ struct {
36
+ int member0;
37
+ int member1;
38
+ } term0;
39
+ } terms;
40
+ };
41
+
42
+ - >
43
+ struct X {
44
+ struct {
45
+ unsigned char term_id : 7;
46
+ unsigned char mark : 1;
47
+ } meta;
48
+ union {
49
+ struct {
50
+ MaybeInt member0;
51
+ } term0;
52
+ struct {
53
+ MaybeInt member0;
54
+ MaybeInt member1;
55
+ } term1;
56
+ } terms;
57
+ };
58
+
59
+ - >
60
+ struct XX {
61
+ struct {
62
+ unsigned char term_id : 7;
63
+ unsigned char mark : 1;
64
+ } meta;
65
+ union {
66
+ struct {
67
+ MaybeInt member0;
68
+ } term0;
69
+ } terms;
70
+ };
71
+
72
+ - >
73
+ struct STupleIntInt {
74
+ union {
75
+ struct {
76
+ int member0;
77
+ int member1;
78
+ } term0;
79
+ } terms;
80
+ };
81
+
82
+ proto_functions:
83
+ - int id(int);
84
+ - MaybeInt initialMaybeInt();
85
+ - Pair toPair(MaybeInt);
86
+ - X swap(X);
87
+ - MaybeInt VC_JustInt(int);
88
+ - MaybeInt VC_NothingInt();
89
+ - MaybeInt alloc_MaybeInt(int);
90
+ - int mark_MaybeInt(MaybeInt);
91
+ - Pair VC_Pair(int, int);
92
+ - Pair alloc_Pair(int);
93
+ - int mark_Pair(Pair);
94
+ - X VC_X1(MaybeInt);
95
+ - X VC_X2(MaybeInt, MaybeInt);
96
+ - X alloc_X(int);
97
+ - int mark_X(X);
98
+ - XX VC_XX(MaybeInt);
99
+ - XX alloc_XX(int);
100
+ - int mark_XX(XX);
101
+ - STupleIntInt VC_STupleIntInt(int, int);
102
+ - int main();
103
+
104
+ functions:
105
+ # Normal functions
106
+ - >
107
+ int id(int x) {
108
+ return x;
109
+ }
110
+
111
+ - >
112
+ MaybeInt initialMaybeInt() {
113
+ return VC_JustInt(1);
114
+ }
115
+
116
+ - >
117
+ Pair toPair(MaybeInt arg) {
118
+ MaybeInt _v00;
119
+ int x;
120
+ MaybeInt hoge;
121
+ Pair _v01;
122
+ return _v00 = arg, (_v00->meta.term_id == 0) ? (x = (_v00->terms.term0.member0), VC_Pair(x, x)) : (_v00->meta.term_id == 1) ? (hoge = (_v00), VC_Pair(id((0)), id((0)))) : ((_v01 = alloc_Pair(0), ffi_pair((&_v01->terms.term0.member0), (&_v01->terms.term0.member1)), _v01));
123
+ }
124
+
125
+ - >
126
+ X swap(X arg) {
127
+ X _v00;
128
+ MaybeInt x;
129
+ MaybeInt y;
130
+ return _v00 = arg, (_v00->meta.term_id == 0) ? (x = (_v00->terms.term0.member0), VC_X1(x)) : (x = (_v00->terms.term1.member0), y = (_v00->terms.term1.member1), VC_X2(y, x));
131
+ }
132
+
133
+ # Type MaybeInt
134
+ - >
135
+ MaybeInt VC_JustInt(int member0) {
136
+ MaybeInt x = alloc_MaybeInt(0);
137
+ x->meta.term_id = 0;
138
+ x->terms.term0.member0 = member0;
139
+ return x;
140
+ }
141
+
142
+ - >
143
+ MaybeInt VC_NothingInt() {
144
+ MaybeInt x = alloc_MaybeInt(0);
145
+ x->meta.term_id = 1;
146
+ return x;
147
+ }
148
+
149
+ - >
150
+ MaybeInt alloc_MaybeInt(int clean_up) {
151
+ static int i = 0;
152
+ static struct MaybeInt memory_MaybeInt[2];
153
+ if (clean_up) {
154
+ for (i = 0; i < 2; i++) memory_MaybeInt[i].meta.mark = 0;
155
+ i = 0;
156
+ return 0;
157
+ }
158
+ while (memory_MaybeInt[i++].meta.mark);
159
+ return memory_MaybeInt + (i - 1);
160
+ }
161
+
162
+ - >
163
+ int mark_MaybeInt(MaybeInt target) {
164
+ target->meta.mark = 1;
165
+ return 0;
166
+ }
167
+
168
+ # Type Pair
169
+ - >
170
+ Pair VC_Pair(int member0, int member1) {
171
+ Pair x = alloc_Pair(0);
172
+ x->meta.term_id = 0;
173
+ x->terms.term0.member0 = member0;
174
+ x->terms.term0.member1 = member1;
175
+ return x;
176
+ }
177
+
178
+ - >
179
+ Pair alloc_Pair(int clean_up) {
180
+ static int i = 0;
181
+ static struct Pair memory_Pair[1];
182
+ if (clean_up) {
183
+ for (i = 0; i < 1; i++) memory_Pair[i].meta.mark = 0;
184
+ i = 0;
185
+ return 0;
186
+ }
187
+ while (memory_Pair[i++].meta.mark);
188
+ return memory_Pair + (i - 1);
189
+ }
190
+
191
+ - >
192
+ int mark_Pair(Pair target) {
193
+ target->meta.mark = 1;
194
+ return 0;
195
+ }
196
+
197
+ # Type X
198
+ - >
199
+ X VC_X1(MaybeInt member0) {
200
+ X x = alloc_X(0);
201
+ x->meta.term_id = 0;
202
+ x->terms.term0.member0 = member0;
203
+ return x;
204
+ }
205
+
206
+ - >
207
+ X VC_X2(MaybeInt member0, MaybeInt member1) {
208
+ X x = alloc_X(0);
209
+ x->meta.term_id = 1;
210
+ x->terms.term1.member0 = member0;
211
+ x->terms.term1.member1 = member1;
212
+ return x;
213
+ }
214
+
215
+ - >
216
+ X alloc_X(int clean_up) {
217
+ static int i = 0;
218
+ static struct X memory_X[0];
219
+ if (clean_up) {
220
+ for (i = 0; i < 0; i++) memory_X[i].meta.mark = 0;
221
+ i = 0;
222
+ return 0;
223
+ }
224
+ while (memory_X[i++].meta.mark);
225
+ return memory_X + (i - 1);
226
+ }
227
+
228
+ - >
229
+ int mark_X(X target) {
230
+ target->meta.mark = 1;
231
+ if (target->meta.term_id == 0) {
232
+ mark_MaybeInt(target->terms.term0.member0);
233
+ }
234
+ if (target->meta.term_id == 1) {
235
+ mark_MaybeInt(target->terms.term1.member0), mark_MaybeInt(target->terms.term1.member1);
236
+ }
237
+ return 0;
238
+ }
239
+
240
+ # Type XX
241
+ - >
242
+ XX VC_XX(MaybeInt member0) {
243
+ XX x = alloc_XX(0);
244
+ x->meta.term_id = 0;
245
+ x->terms.term0.member0 = member0;
246
+ return x;
247
+ }
248
+
249
+ - >
250
+ XX alloc_XX(int clean_up) {
251
+ static int i = 0;
252
+ static struct XX memory_XX[0];
253
+ if (clean_up) {
254
+ for (i = 0; i < 0; i++) memory_XX[i].meta.mark = 0;
255
+ i = 0;
256
+ return 0;
257
+ }
258
+ while (memory_XX[i++].meta.mark);
259
+ return memory_XX + (i - 1);
260
+ }
261
+
262
+ - >
263
+ int mark_XX(XX target) {
264
+ target->meta.mark = 1;
265
+ mark_MaybeInt(target->terms.term0.member0);
266
+ return 0;
267
+ }
268
+
269
+ # Type STupleIntInt
270
+ - >
271
+ STupleIntInt VC_STupleIntInt(int member0, int member1) {
272
+ STupleIntInt x;
273
+ x.terms.term0.member0 = member0;
274
+ x.terms.term0.member1 = member1;
275
+ return x;
276
+ }
277
+
278
+ # Main functions
279
+ - >
280
+ int main() {
281
+ int c = 0, l = 1;
282
+ MaybeInt bufNode[2];
283
+ Pair node1[1];
284
+ init_system();
285
+ bufNode[l] = initialMaybeInt();
286
+ while (1) {
287
+ alloc_MaybeInt(1);
288
+ alloc_Pair(1);
289
+ mark_MaybeInt(bufNode[l]);
290
+ bufNode[c] = get_maybe_int();
291
+ node1[0] = toPair((bufNode[c]), (bufNode[l]));
292
+ c ^= 1, l ^= 1;
293
+ }
294
+ return 0;
295
+ }