int NT_MODULE = 0 int NT_MOD_EX = 1 int NT_BLOCK = 2 int NT_FUNC = 3 int NT_PARAM = 4 int NT_RESULT = 5 int NT_DATA = 6 int NT_TYPE = 7 int NT_STRUCT = 8 struct Node { int _type, ~uint8 data, utils.Vector sub } /; method Node /; init (int typ, ~uint8 dat) self._type = typ self.data = dat Node sub self.sub.init(len sub) ;/ /; end _delete(self.data) ~Node n /; loop (int i = 0; i < self.sub.count) [i++] n = self.sub.get(i) n`.end() ;/ self.sub.end() ;/ ;/ /; check_via_next (~utils.Iterator it, ~uint8 chk) [bool] it`.next() /; if (it`.at_end() == true) it`.prev() return false ;/ ~Token cur = it`.get() /; if (utils.strcmp(cur`.data, cur) == true) return true ;/ it`.prev() return false ;/ /; check_and_advance (~utils.Iterator it, ~uint8 chk) [bool] /; if (it`.at_end() == true) return false ;/ ~Token cur = it`.get() /; if (utils.strcmp(cur`.data, cur) == true) it`.next() return true ;/ return false ;/ /; build_struct (~utils.Iterator it, ~Node mod, ~utils.File fin) ;/ /; build_module (~utils.Iterator it, ~Node mod, ~utils.File fin) int NT = NT_MODULE ~Token t = it`.get() /; if (utils.strcmp(t`.data, "export\0")) NT = NT_MOD_EX it`.next() ;/ Node sub it`.next() t = it`.get() /; if (t`._type !== TT_DEFWORD) _printf("Error in module decl") return ;/ sub.init(NT, utils.strcpy(t`.data)) bool run = true /; loop (it`.at_end() == false && run == true) t = it`.get() /; if (utils.strcmp(t`.data, ";/\0") || utils.strcmp(t`.data, ";;\0")) run = false ;; else if (utils.strcmp(t`.data, "/;\0")) _printf("Block detected!\n\0") build_block(it, ~sub, fin) ;; else if (utils.strcmp(t`.data, "struct\0") == true) _printf("Struct detected!\n\0") build_struct(it, ~sub, fin) ;; else if (utils.strcmp(t`.data, ":\0") == true) _printf("Preproc detected!\n\0") build_preproc(it, ~sub, fin) ;; else if (at_defn(it) == true) _printf("Defn detected!\n\0") build_vardef(it, ~sub, fin) ;; else # _printf("Error detected!\n\0") # TODO: ERROR ;/ /; if (run == true) it`.next() ;/ ;/ mod`.sub.push(~sub) ;/ /; build_method (~utils.Iterator it, ~Node mod, ~utils.File fin) ;/ /; build_function (~utils.Iterator it, ~Node mod, ~utils.File fin) ;/ /; build_block (~utils.Iterator it, ~Node mod, ~utils.File fin) it`.next() /; if (it`.at_end() == true) return ;/ ~Token cur bool run = true /; loop (it`.at_end() == false && run == true) cur = it`.get() /; if (utils.strcmp(cur`.data, "module\0") || utils.strcmp(cur`.data, "export\0")) build_module(it, mod, fin) ;; else if (utils.strcmp(cur`.data, "method\0") == true) build_method(it, mod, fin) ;; else if (cur`._type == TT_DEFWORD) build_function(it, mod, fin) ;; else # TODO: ERROR ;/ cur = it`.get() /; if (utils.strcmp(cur`.data, ";/\0") == true) run = false ;; else if (utils.strcmp(cur`.data, ";;\0") == true) it`.next() ;; else run = false # report error ;/ ;/ ;/ /; build_preproc (~utils.Iterator it, ~Node mod, ~utils.File fin) it`.next() /; if (it`.at_end() == true) return ;/ ~Token cur = it`.get() /; if (utils.strcmp(cur`.data, "import\0") == true) # get file path it`.next() cur = it`.get() # gen new file struct ~uint8 frel = utils.unquote_str(cur`.data) _printf("\nReading file: \0") _printf(frel) _printf("\n\0") utils.File fnew = fin`.relative(frel) # file import build_file(~fnew, mod) # cleanup _delete(frel) fnew.end() ;; else # unknown preproc return ;/ ;/ /; build_vardef (~utils.Iterator it, ~Node mod, ~utils.File fin) ;/ /; at_defn (~utils.Iterator it) [bool] return false ;/ ~uint8 TOKEN_COUNT = "Token count: %d\n\0" /; build_file (~utils.File fin, ~Node mod) utils.Vector tokens = tokenize(fin) _print_num(TOKEN_COUNT, tokens.count) utils.Iterator tokit tokit.init(~tokens) /; loop (tokit.at_end() == false) ~Token t = tokit.get() /; if (utils.strcmp(t`.data, "/;\0") || utils.strcmp(t`.data, ";;\0")) _printf("Block detected!\n\0") build_block(~tokit, mod, fin) ;; else if (utils.strcmp(t`.data, "struct\0") == true) _printf("Struct detected!\n\0") build_struct(~tokit, mod, fin) ;; else if (utils.strcmp(t`.data, ":\0") == true) _printf("Preproc detected!\n\0") build_preproc(~tokit, mod, fin) ;; else if (at_defn(~tokit) == true) _printf("Defn detected!\n\0") build_vardef(~tokit, mod, fin) ;; else # _printf("Error detected!\n\0") # TODO: ERROR ;/ tokit.next() ;/ free_token_list(~tokens) ;/