summaryrefslogtreecommitdiff
path: root/tnslc/compiler.tnsl
diff options
context:
space:
mode:
Diffstat (limited to 'tnslc/compiler.tnsl')
-rw-r--r--tnslc/compiler.tnsl253
1 files changed, 66 insertions, 187 deletions
diff --git a/tnslc/compiler.tnsl b/tnslc/compiler.tnsl
index ab43e6b..e455bb1 100644
--- a/tnslc/compiler.tnsl
+++ b/tnslc/compiler.tnsl
@@ -45,38 +45,85 @@ struct Path {
/; method Path
/; start (~uint8 path)
self.split_path = _alloc(8)
- self.split_path{0} = _alloc(1)
- self.path_count = 1
-
- int i = 0
- int j = cstr_len(path)
-
- /; loop (i < j) [i++]
- /; if (path{i} == '\\' || path{i} == '/')
-
- ;/
- ;/
+ self.path_count = 0
+ self.relative_file(path)
;/
/; copy [Path]
Path out
- out.start(self.full_path())
- ;/
-
- /; sub_folder (~uint8 sub)
- ~uint8 file_name
+ ~uint8 f_pth = self.full_path()
+ out.start(f_pth)
+ _delete(f_pth)
+ return out
;/
- /; relative_file(~uint8 rel_pth) [Path]
+ /; relative_file(~uint8 rel_path)
+ # Assume the last string is the file name
+ /; if (self.path_count > 0)
+ int idx = self.path_count - 1
+ _delete(self.split_path{idx})
+ self.path_count--
+ ;/
+
+ ~uint8 n_ptr = _alloc(1)
+ n_ptr{0} = 0
+ int idx = self.path_count
+
+ /; loop (int i = 0; i < cstr_len(rel_path)) [i++]
+ /; if (rel_path{i} == '\\' || rel_path{i} == '/')
+ /; if (cstr_len(n_ptr) > 0)
+ self.path_count++
+ idx = self.path_count
+ self.split_path = _realloc(self.split_path, idx * 8)
+ self.split_path{idx - 1} = n_ptr
+
+ n_ptr = _alloc(1)
+ n_ptr{0} = 0
+ ;/
+ ;; else
+ idx = cstr_len(n_ptr)
+ n_ptr = _realloc(n_ptr, idx + 2)
+ n_ptr{idx} = rel_path{i}
+ n_ptr{idx + 1} = 0
+ ;/
+ ;/
+ /; if (cstr_len(n_ptr) > 0)
+ self.path_count++
+ idx = self.path_count
+ self.split_path = _realloc(self.split_path, idx * 8)
+ self.split_path{idx - 1} = n_ptr
+ ;/
;/
/; full_path [~uint8]
~uint8 pth = _alloc(1)
+ pth{0} = 0
- /; loop (pth)
+ /; loop (int i = 0; i < self.path_count) [i++]
+ ~uint8 w_ptr = self.split_path{i}
+
+ int old_len = cstr_len(pth)
+ int new_len = cstr_len(w_ptr) + old_len
+
+
+ /; if (i < self.path_count - 1)
+ pth = _alloc(new_len + 2)
+ pth{new_len} = '/'
+ pth{new_len + 1} = 0
+ old_len++
+ new_len++
+ ;; else
+ pth = _alloc(new_len + 1)
+ pth{new_len} = 0
+ ;/
+ /; loop (int j = 0; j < new_len - old_len) [j++]
+ pth{old_len + j} = w_ptr{j}
+ ;/
;/
+
+ return pth
;/
/; open_read [~void]
@@ -102,174 +149,6 @@ struct Path {
;/
;/
-
-#
-# Actual compiler code -- here be dragons
-#
-
-# Types of pointers the compiler may generate or work with
-enum PTR_TYPE [uint] {
- POINTER = 0,
- REFERENCE = 1,
- ARRAY = 2
-}
-
-# Represents a type of a variable
-struct Type {
- int
- s, # size of type (bytes)
- p_ct, # ptr_chain count
- m_ct, # member count
- ~uint8
- name, # name of the type
- ~uint
- ptr_chain, # for every pointer augment on the type, give it an extra PTR_TYPE in the chain
- ~Variable
- members, # member variables (their types and names)
- ~Module
- mod # the methods (if any) that are associated with this type
-}
-
-/; method Type
- /; start
-
- ;/
-
- /; size [int]
- /; loop (int i = 0; i < self.p_ct) [i++]
- /; if (self.ptr_chain{i} == PTR_TYPE.REFERENCE)
- return 8
- ;/
- ;/
- return self.s
- ;/
-
- /; _del
- _delete(self.name)
- _delete(self.ptr_chain)
- _delete(self.members)
- _delete(self.mod)
- ;/
-;/
-
-/; NO_TYPE [Type]
- Type t
- t.s = 0
- t.name = 0
- t.ptr_chain = 0
- t.members = 0
- t.mod = 0
- return t
-;/
-
-/; is_primitive (~uint8 name)
-
-;/
-
-# Location type represents the type of memory
-# that the variable is stored in
-enum LOCATION [uint] {
- REGISTER = 0,
- STACK = 1,
- LABEL = 2,
- LITERAL = 3
-}
-
-# The Big Kahuna
-struct Variable {
- ~uint8
- name,
- Type
- _type,
- uint
- location, # Actual location. If literal, the literal value.
- # If register, corrosponds to a register name.
- # If stack, represents the offset from the base pointer
- # Ignore if label.
- loc_type
-}
-
-# I hate c-like strings. Hopefully once I'm done with this
-# language I'll have something that doesn't use them
-
-
-# This part sucks ass
-/; method Variable
-
-;/
-
-# Scopes
-struct Scope {
- int
- num,
- c, # Figure it out yourself
- tmp,
- ~Scope
- parent,
- ~uint8
- name
-}
-
-/; method Scope
-
-;/
-
-struct Function {
- ~uint8
- name,
- ~Type
- inputs,
- Type
- output,
- ~Module mod
-}
-
-/; method Function
-
-;/
-
-struct Module {
- ~Module
- parent,
- bool
- exp, # Export functions or not
- ~uint8
- name,
- ~Type
- types, # Types defined in this module
- ~Variable
- defs, # Variables defined in this module
- ~Function
- functions, # Functions defined in this module
- ~Module
- sub # Sub modules
-}
-
-/; method Module
-
-;/
-
-#
-# Actual compiler functions
-#
-
-# Used in the first pass
-/; get_type_P1
-
-;/
-
-/; get_type_P2
-
-;/
-
-/; get_artifact [~~uint8]
-
-;/
-
-/; is_call [bool]
-
-;/
-
-/; is_definition
+/; compile (Path in, out)
;/ \ No newline at end of file