TC-C Samples
The combine module provides various tasks to simulate compiler options
to use with tc, where you first enable extensions and then process them.
Note
You can use --c-* to enable extensions and --combine-* tasks to
perform operations combining multiple language extensions.
For instance, we perform renaming with bounds-checking and overloading activated:
bounds-n-overloads.tig
let
type int_array = array of int
type string_array = array of string
function get(arr: int_array, pos: int) : int = arr[pos]
function get(arr: string_array, pos: int) : string = arr[pos]
var arr1 := int_array[10] of 0
var arr2 := string_array[10] of ""
in
get(arr1, 0);
get(arr2, 10)
end
tc --c-bounds --c-overload --combine-rename -A bounds-n-overloads.tig
$ tc --c-bounds --c-overload --combine-rename -A bounds-n-overloads.tig
/* == Abstract Syntax Tree. == */
primitive print(string_0 : string)
primitive print_err(string_1 : string)
primitive print_int(int_2 : int)
primitive flush()
primitive getchar() : string
primitive ord(string_3 : string) : int
primitive chr(code_4 : int) : string
primitive size(string_5 : string) : int
primitive streq(s1_6 : string, s2_7 : string) : int
primitive strcmp(s1_8 : string, s2_9 : string) : int
primitive substring(string_10 : string, start_11 : int, length_12 : int) : string
primitive concat(fst_13 : string, snd_14 : string) : string
primitive not(boolean_15 : int) : int
primitive exit(status_16 : int)
primitive gc_enable(enable_17 : int)
primitive gc_run()
function _main() =
(
let
type int_array_18 = array of int
type string_array_19 = array of string
function get_22(arr_20 : int_array_18, pos_21 : int) : int =
arr_20[pos_21]
function get_25(arr_23 : string_array_19, pos_24 : int) : string =
arr_23[pos_24]
var arr1_26 := int_array_18 [10] of 0
var arr2_27 := string_array_19 [10] of ""
in
(
get_22(arr1_26, 0);
get_25(arr2_27, 10)
)
end;
()
)
$ echo $?
0
Note
--c-all enables all extensions, and --combine-desugar desugars
them into core Tiger.
0.tig
0
tc --c-all --combine-desugar -A 0.tig
$ tc --c-all --combine-desugar -A 0.tig
/* == Abstract Syntax Tree. == */
primitive print(string_0 : string)
primitive print_err(string_1 : string)
primitive print_int(int_2 : int)
primitive flush()
primitive getchar() : string
primitive ord(string_3 : string) : int
primitive chr(code_4 : int) : string
primitive size(string_5 : string) : int
primitive streq(s1_6 : string, s2_7 : string) : int
primitive strcmp(s1_8 : string, s2_9 : string) : int
primitive substring(string_10 : string, start_11 : int, length_12 : int) : string
primitive concat(fst_13 : string, snd_14 : string) : string
primitive not(boolean_15 : int) : int
primitive exit(status_16 : int)
primitive gc_enable(enable_17 : int)
primitive gc_run()
function _main() =
let
type __int_array = array of int
type _int_array = {
arr : __int_array,
size : int
}
in
let
type _variant_Object = { exact_type : int }
var _id_Object := 0
in
(
0;
()
)
end
end
$ echo $?
0
Shorthands for these two tasks are also provided, respectively -a and
-c.
all-extensions.tig
let
type int_array = array of int
function print(n: int) = print_int(n)
class C
{
var a_size := 10
var a := int_array[10] of 0
method print_a() =
(
if self.a_size = 0
then
()
else
(
print(self.a[0]);
for i := 1 to self.a_size - 1 do
(
print(", ");
print(self.a[i])
)
)
)
}
var c := new C
in
c.a[c.a_size - 1] := 42;
c.print_a()
end
tc -acA all-extensions.tig
$ tc -acA all-extensions.tig
/* == Abstract Syntax Tree. == */
primitive print(string_0 : string)
primitive print_err(string_1 : string)
primitive print_int(int_2 : int)
primitive flush()
primitive getchar() : string
primitive ord(string_3 : string) : int
primitive chr(code_4 : int) : string
primitive size(string_5 : string) : int
primitive streq(s1_6 : string, s2_7 : string) : int
primitive strcmp(s1_8 : string, s2_9 : string) : int
primitive substring(string_10 : string, start_11 : int, length_12 : int) : string
primitive concat(fst_13 : string, snd_14 : string) : string
primitive not(boolean_15 : int) : int
primitive exit(status_16 : int)
primitive gc_enable(enable_17 : int)
primitive gc_run()
function _main() =
let
type __int_array = array of int
type _int_array = {
arr : __int_array,
size : int
}
in
let
type _box_int_array_18 = {
arr : int_array_18,
size : int
}
type _variant_Object = {
exact_type : int,
field_C_23 : _contents_C_23
}
type int_array_18 = array of int
type _contents_C_23 = {
a_size : int,
a : _box_int_array_18
}
type _variant_C_23 = {
exact_type : int,
field_C_23 : _contents_C_23
}
var _id_Object := 0
var _id_C_23 := 1
in
(
let
var c_24 := let
var res : _variant_C_23 := let
var contents_C_23 := _contents_C_23 {
a_size = 10,
a = let
var _size := 10
in
_box_int_array_18 {
arr = int_array_18 [_size] of 0,
size = _size
}
end
}
in
_variant_C_23 {
exact_type = _id_C_23,
field_C_23 = contents_C_23
}
end
in
res
end
in
(
c_24.field_C_23.a.arr[let
var a : _int_array := _cast(c_24.field_C_23.a, _int_array)
var index : int := c_24.field_C_23.a_size - 1
var location : string := "all-extensions.tig:31.3-19"
var res : int := (
if if index < 0
then 1
else (index >= a.size) <> 0
then (
print_err(location);
print_err(": array index out of bounds.\n");
exit(120)
)
else ();
index
)
in
res
end] := 42;
let
var self : _variant_C_23 := c_24
var res := let
var self : _variant_C_23 := self
var res := (if self.field_C_23.a_size = 0
then ()
else (
let
var n_19 : int := self.field_C_23.a.arr[let
var a : _int_array := _cast(self.field_C_23.a, _int_array)
var index : int := 0
var location : string := "all-extensions.tig:19.9-23"
var res : int := (
if if index < 0
then 1
else (index >= a.size) <> 0
then (
print_err(location);
print_err(": array index out of bounds.\n");
exit(120)
)
else ();
index
)
in
res
end]
var res := print_int(n_19)
in
res
end;
let
var _lo := 1
var _hi := self.field_C_23.a_size - 1
var i_21 := _lo
in
if _lo <= _hi
then while 1 do
(
(
print(", ");
let
var n_19 : int := self.field_C_23.a.arr[let
var a : _int_array := _cast(self.field_C_23.a, _int_array)
var index : int := i_21
var location : string := "all-extensions.tig:23.13-27"
var res : int := (
if if index < 0
then 1
else (index >= a.size) <> 0
then (
print_err(location);
print_err(": array index out of bounds.\n");
exit(120)
)
else ();
index
)
in
res
end]
var res := print_int(n_19)
in
res
end
);
if i_21 = _hi
then break
else ();
i_21 := i_21 + 1
)
else ()
end
))
in
res
end
in
res
end
)
end;
()
)
end
end
$ echo $?
0