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.
- checksums.yaml +7 -0
- data/.ctags +3 -0
- data/.editorconfig +9 -0
- data/.gitignore +14 -0
- data/.rubocop.yml +629 -0
- data/.travis.yml +12 -0
- data/Gemfile +2 -0
- data/LICENSE +28 -0
- data/README.md +34 -0
- data/Rakefile +1 -0
- data/base-library/Base.sfrp +81 -0
- data/base-library/IO/AVR/ATMEGA8.c +9 -0
- data/base-library/IO/AVR/ATMEGA8.h +6 -0
- data/base-library/IO/AVR/ATMEGA8.sfrp +4 -0
- data/base-library/IO/STDIO.c +40 -0
- data/base-library/IO/STDIO.h +13 -0
- data/base-library/IO/STDIO.sfrp +10 -0
- data/bin/sfrp +7 -0
- data/lib/sfrp.rb +2 -0
- data/lib/sfrp/command.rb +73 -0
- data/lib/sfrp/compiler.rb +94 -0
- data/lib/sfrp/error.rb +4 -0
- data/lib/sfrp/file.rb +18 -0
- data/lib/sfrp/flat/dsl.rb +33 -0
- data/lib/sfrp/flat/elements.rb +90 -0
- data/lib/sfrp/flat/exception.rb +45 -0
- data/lib/sfrp/flat/expression.rb +125 -0
- data/lib/sfrp/flat/set.rb +61 -0
- data/lib/sfrp/input/exception.rb +16 -0
- data/lib/sfrp/input/parser.rb +417 -0
- data/lib/sfrp/input/set.rb +29 -0
- data/lib/sfrp/input/transformer.rb +219 -0
- data/lib/sfrp/low/dsl.rb +126 -0
- data/lib/sfrp/low/element.rb +126 -0
- data/lib/sfrp/low/set.rb +62 -0
- data/lib/sfrp/mono/dsl.rb +120 -0
- data/lib/sfrp/mono/environment.rb +26 -0
- data/lib/sfrp/mono/exception.rb +21 -0
- data/lib/sfrp/mono/expression.rb +124 -0
- data/lib/sfrp/mono/function.rb +86 -0
- data/lib/sfrp/mono/memory.rb +32 -0
- data/lib/sfrp/mono/node.rb +125 -0
- data/lib/sfrp/mono/pattern.rb +69 -0
- data/lib/sfrp/mono/set.rb +151 -0
- data/lib/sfrp/mono/type.rb +210 -0
- data/lib/sfrp/mono/vconst.rb +134 -0
- data/lib/sfrp/output/set.rb +33 -0
- data/lib/sfrp/poly/dsl.rb +171 -0
- data/lib/sfrp/poly/elements.rb +168 -0
- data/lib/sfrp/poly/exception.rb +42 -0
- data/lib/sfrp/poly/expression.rb +170 -0
- data/lib/sfrp/poly/monofier.rb +73 -0
- data/lib/sfrp/poly/set.rb +90 -0
- data/lib/sfrp/poly/typing.rb +197 -0
- data/lib/sfrp/raw/dsl.rb +41 -0
- data/lib/sfrp/raw/elements.rb +164 -0
- data/lib/sfrp/raw/exception.rb +40 -0
- data/lib/sfrp/raw/expression.rb +168 -0
- data/lib/sfrp/raw/namespace.rb +30 -0
- data/lib/sfrp/raw/set.rb +109 -0
- data/lib/sfrp/version.rb +3 -0
- data/sfrp.gemspec +40 -0
- data/spec/sfrp/Test.sfrp +4 -0
- data/spec/sfrp/compiler_spec.rb +17 -0
- data/spec/sfrp/flat/set_spec.rb +40 -0
- data/spec/sfrp/input/parse_test.sfrp +20 -0
- data/spec/sfrp/input/set_spec.rb +18 -0
- data/spec/sfrp/low/set_spec.rb +20 -0
- data/spec/sfrp/mono/expected.yml +295 -0
- data/spec/sfrp/mono/set_spec.rb +152 -0
- data/spec/sfrp/output/set_spec.rb +29 -0
- data/spec/sfrp/poly/set_spec.rb +290 -0
- data/spec/sfrp/raw/set_spec.rb +38 -0
- data/spec/spec_helper.rb +16 -0
- data/test/IntTest/Main.c +5 -0
- data/test/IntTest/Main.h +6 -0
- data/test/IntTest/Main.sfrp +10 -0
- data/test/IntTest/in.txt +3 -0
- data/test/IntTest/out.txt +4 -0
- data/test/MaybeTest/Main.sfrp +8 -0
- data/test/MaybeTest/SubDir/Lib.sfrp +9 -0
- data/test/MaybeTest/in.txt +6 -0
- data/test/MaybeTest/out.txt +6 -0
- data/test/Rakefile +15 -0
- metadata +290 -0
data/lib/sfrp/raw/set.rb
ADDED
@@ -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
|
data/lib/sfrp/version.rb
ADDED
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
|
data/spec/sfrp/Test.sfrp
ADDED
@@ -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
|
+
}
|