From 09df1bb48823631228af3df647111af1eebc854b Mon Sep 17 00:00:00 2001 From: Kyle Gunger Date: Thu, 16 Feb 2023 05:14:31 -0500 Subject: Collapse tnslc into a single file --- tnslc/tests/complex/enums.tnsl | 84 +++++++++++++++++++++++++++++++++++++ tnslc/tests/complex/generics.tnsl | 35 ++++++++++++++++ tnslc/tests/complex/if_else.tnsl | 46 ++++++++++++++++++++ tnslc/tests/complex/interfaces.tnsl | 0 tnslc/tests/complex/loops.tnsl | 0 tnslc/tests/complex/switch.tnsl | 0 tnslc/tests/simple/comments.tnsl | 52 +++++++++++++++++++++++ tnslc/tests/simple/if_else.tnsl | 0 tnslc/tests/simple/includes_a.tnsl | 1 + tnslc/tests/simple/includes_b.tnsl | 0 tnslc/tests/simple/modules_a.tnsl | 0 tnslc/tests/simple/modules_b.tnsl | 0 tnslc/tests/simple/structs.tnsl | 0 13 files changed, 218 insertions(+) create mode 100644 tnslc/tests/complex/enums.tnsl create mode 100644 tnslc/tests/complex/generics.tnsl create mode 100644 tnslc/tests/complex/if_else.tnsl create mode 100644 tnslc/tests/complex/interfaces.tnsl create mode 100644 tnslc/tests/complex/loops.tnsl create mode 100644 tnslc/tests/complex/switch.tnsl create mode 100644 tnslc/tests/simple/comments.tnsl create mode 100644 tnslc/tests/simple/if_else.tnsl create mode 100644 tnslc/tests/simple/includes_a.tnsl create mode 100644 tnslc/tests/simple/includes_b.tnsl create mode 100644 tnslc/tests/simple/modules_a.tnsl create mode 100644 tnslc/tests/simple/modules_b.tnsl create mode 100644 tnslc/tests/simple/structs.tnsl (limited to 'tnslc/tests') diff --git a/tnslc/tests/complex/enums.tnsl b/tnslc/tests/complex/enums.tnsl new file mode 100644 index 0000000..80776f0 --- /dev/null +++ b/tnslc/tests/complex/enums.tnsl @@ -0,0 +1,84 @@ +# Enums should be able to store structs as well +struct EnumTester { + int i, j + ~EnumTester ptr +} + +# Simple integer enum +enum IntEnum [int] { + A = 0, + B = 1, + C = -2 +} + +# Simple float enum +enum FloatEnum[float] { + A = 0.1, + B = 0.2, + C = 3.1415 +} + +# More complex struct enum +enum TestEnum [EnumTester] { + A = {1, 2, null}, + B = {2, 3, ~TestEnum.A}, + C = {3, 3, null} +} + +# Type enum +enum TypeEnum [type] { + A = int, + B = float, + C = EnumTester +} + +enum SurfaceType [int] { + LAND = 0, + WATER = 1, + AIR = 2, + + SPACE = -1 +} + +/; interface Vehicle + /; fuel [float] ;/ + /; max_speed [float] ;/ + /; min_speed [float] ;/ + /; can_travel (SurfaceType surface) [bool] ;/ +;/ + +struct Car extends Vehicle { + int wheels +} + +struct Boat extends Vehicle { + int propellers +} + +struct Plane extends Vehicle { + bool biplane, passenger + int engines, +} + +struct Rocket extends Vehicle { + int + engines, + stages +} + +struct HoverCraft extends Vehicle { + {3}float + max_antigrav, + bool + space_ready +} + +# Enums can also handle interfaces (and extended types) +# but only if the given standard library has support for those things +enum CommonVehicles [Vehicle] { + A = {4}[Car], + B = {1}[Boat], + C = {false, true, 2}[Plane], + D = {4, 5}[Rocket], + E = {{5, 14.8, 5}, false}[HoverCraft] +} diff --git a/tnslc/tests/complex/generics.tnsl b/tnslc/tests/complex/generics.tnsl new file mode 100644 index 0000000..3f62474 --- /dev/null +++ b/tnslc/tests/complex/generics.tnsl @@ -0,0 +1,35 @@ +struct ListNode (type T) { + T element, + ~ListNode(T) next +} + +/; method ListNode + /; get_el [T] + return self.element + ;/ + + /; get_next [ListNode(T)] + return self.next` + ;/ +;/ + +struct ReferenceNode (type T) extends ListNode(T`) { + super +} + +/; method ReferenceNode + /; change_ref (~T new_ref) + ~self.element = new_ref + ;/ +;/ + +struct List(type T) { + +} + +# Generic (type T) +# Unknown generic (?) +# Ref to a type (type T) -> T` +# Ref types can be used interchangably with their referenced type while pointer types can not +# Variables typed by reference have the additional trait that you can +# set the address of that variable \ No newline at end of file diff --git a/tnslc/tests/complex/if_else.tnsl b/tnslc/tests/complex/if_else.tnsl new file mode 100644 index 0000000..d965e6b --- /dev/null +++ b/tnslc/tests/complex/if_else.tnsl @@ -0,0 +1,46 @@ +/; main [int] + /; if () + + ;/ + + /; if () + + ;; else + + ;/ + + /; if () + + ;//; else + + ;/ + + /; if () + + ;; else if () + + ;/ + + /; if () [] + ;; else if () [] + ;; else [] + ;/ + + /; if () [] + ;; if () [] + ;; else [] + ;/ + + /; if () [] + ;; if () [] + ;; else if () [] + ;; else [] + ;/ + + int i = 0 + + # Short if syntax for variable declaration + i = if (i < 1) [7] else [9] + + ;return 0 +;/ \ No newline at end of file diff --git a/tnslc/tests/complex/interfaces.tnsl b/tnslc/tests/complex/interfaces.tnsl new file mode 100644 index 0000000..e69de29 diff --git a/tnslc/tests/complex/loops.tnsl b/tnslc/tests/complex/loops.tnsl new file mode 100644 index 0000000..e69de29 diff --git a/tnslc/tests/complex/switch.tnsl b/tnslc/tests/complex/switch.tnsl new file mode 100644 index 0000000..e69de29 diff --git a/tnslc/tests/simple/comments.tnsl b/tnslc/tests/simple/comments.tnsl new file mode 100644 index 0000000..dbece20 --- /dev/null +++ b/tnslc/tests/simple/comments.tnsl @@ -0,0 +1,52 @@ +# These are tests for where comments may be located +# as well as the type of comments that may be parsed. +# A '#' denotes a single line comment, and will +# ignore everything on the line. +# '/#' denotes the start of a multi line comment +# if you want to use '#/' (the end of a multiline comment) +# inside of a multiline comment, use '#' at the start of the line +# to escape the whole line. + +/# + This is an example + of a multiline comment. +#/ + +/# +# This is also a multiline comment +# however, you can use #/ +# inside of it because we have '#' at +# the start of each line +#/ + +/## +# This is an example of a doc comment. +# It is a doc comment of a code block because it starts with '/##' instead of '/#' +# and ends with '# ;' which ends the comment and opens a block. +# This doc comment is on the main function +#; main /# Comment inside function declaration #/ [int /# Comment inside this list of outputs #/ ] + return 0 # line comment inside a function + /# Block comment inside function #/ +;/ + +/# Comment before block opens #/ /; interface /# Comment in interface block definition #/ ITest + # Comment in interface block + /; test_method [int] ;/ +/# Comment before block closes #/ ;/ + +struct Test { + # comment inside a list of member variables + int /# Comment btwn type and variable name #/ i +} + +/; method /# Comment in method block definition #/ Test + # Comment in method block + /; /# Comment before method name#/ test_method (/# Comment inside function params #/) [/# comment inside return type again#/ int] +/# Comment at start of line before statement#/ return /# Comment btwn return and value #/ i + ;/ + + /; cf_comment [int] + + ;/ +;/ + diff --git a/tnslc/tests/simple/if_else.tnsl b/tnslc/tests/simple/if_else.tnsl new file mode 100644 index 0000000..e69de29 diff --git a/tnslc/tests/simple/includes_a.tnsl b/tnslc/tests/simple/includes_a.tnsl new file mode 100644 index 0000000..930098a --- /dev/null +++ b/tnslc/tests/simple/includes_a.tnsl @@ -0,0 +1 @@ +:include "includes_b.tnsl" \ No newline at end of file diff --git a/tnslc/tests/simple/includes_b.tnsl b/tnslc/tests/simple/includes_b.tnsl new file mode 100644 index 0000000..e69de29 diff --git a/tnslc/tests/simple/modules_a.tnsl b/tnslc/tests/simple/modules_a.tnsl new file mode 100644 index 0000000..e69de29 diff --git a/tnslc/tests/simple/modules_b.tnsl b/tnslc/tests/simple/modules_b.tnsl new file mode 100644 index 0000000..e69de29 diff --git a/tnslc/tests/simple/structs.tnsl b/tnslc/tests/simple/structs.tnsl new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3