sfrp 1.1.0

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