|
|
@@ -0,0 +1,216 @@ |
|
|
|
#include <xolatile/xtandard.c> |
|
|
|
|
|
|
|
enum { |
|
|
|
core_none, core_word, core_marker, core_string, core_number, |
|
|
|
core_symbol |
|
|
|
}; |
|
|
|
|
|
|
|
enum { |
|
|
|
word_type, word_loop, word_if, word_else, word_case, |
|
|
|
word_return, word_import, word_export, word_define, word_system |
|
|
|
}; |
|
|
|
|
|
|
|
#define STRING_LIMIT (80) |
|
|
|
#define NAME_LIMIT (80) |
|
|
|
|
|
|
|
static int token_count = 0; |
|
|
|
static int string_code = 0; |
|
|
|
static int number_code = 0; |
|
|
|
static int marker_code = 0; |
|
|
|
static int symbol_code = 0; |
|
|
|
|
|
|
|
static int * token_data = null; |
|
|
|
static int * token_type = null; |
|
|
|
static char * * string_name = null; |
|
|
|
static char * * string_data = null; |
|
|
|
static int * string_size = null; |
|
|
|
static char * * number_name = null; |
|
|
|
static int * number_data = null; |
|
|
|
static char * * marker_name = null; |
|
|
|
static int * marker_type = null; |
|
|
|
static char * symbol_data = null; |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
static char * word_list [] = { |
|
|
|
"type", "loop", "if", "else", "case", "return", |
|
|
|
"import", "export", "define", "system" |
|
|
|
}; |
|
|
|
|
|
|
|
static void add_token (int type, int data) { |
|
|
|
token_data = reallocate (token_data, (token_count + 1) * (int) sizeof (* token_data)); |
|
|
|
token_type = reallocate (token_type, (token_count + 1) * (int) sizeof (* token_type)); |
|
|
|
token_data [token_count] = data; |
|
|
|
token_type [token_count] = type; |
|
|
|
++token_count; |
|
|
|
} |
|
|
|
|
|
|
|
static void add_string (char * data, int size) { |
|
|
|
string_data = reallocate (string_data, (string_code + 1) * (int) sizeof (* string_data)); |
|
|
|
string_size = reallocate (string_size, (string_code + 1) * (int) sizeof (* string_size)); |
|
|
|
string_data [string_code] = allocate (STRING_LIMIT * (int) sizeof (* string_data)); |
|
|
|
string_copy (string_data [string_code], data); |
|
|
|
string_size [string_code] = size; |
|
|
|
++string_code; |
|
|
|
} |
|
|
|
|
|
|
|
static void add_number (int data) { |
|
|
|
number_data = reallocate (number_data, (number_code + 1) * (int) sizeof (* number_data)); |
|
|
|
number_data [number_code] = data; |
|
|
|
++number_code; |
|
|
|
} |
|
|
|
|
|
|
|
static void add_marker (char * name, int type) { |
|
|
|
marker_name = reallocate (marker_name, (marker_code + 1) * (int) sizeof (* marker_name)); |
|
|
|
marker_type = reallocate (marker_type, (marker_code + 1) * (int) sizeof (* marker_type)); |
|
|
|
marker_name [marker_code] = allocate (NAME_LIMIT * (int) sizeof (* marker_name)); |
|
|
|
string_copy (marker_name [marker_code], name); |
|
|
|
marker_type [marker_code] = type; |
|
|
|
++marker_code; |
|
|
|
} |
|
|
|
|
|
|
|
static void add_symbol (char data) { |
|
|
|
symbol_data = reallocate (symbol_data, (symbol_code + 1) * (int) sizeof (* symbol_data)); |
|
|
|
symbol_data [symbol_code] = data; |
|
|
|
++symbol_code; |
|
|
|
} |
|
|
|
|
|
|
|
static void kill (char * data) { |
|
|
|
terminal_colour (colour_red, effect_bold); |
|
|
|
echo (data); |
|
|
|
terminal_cancel (); |
|
|
|
exit (log_failure); |
|
|
|
} |
|
|
|
|
|
|
|
int main (void) { |
|
|
|
char * buffer = null; |
|
|
|
int offset = 0; |
|
|
|
int length = 0; |
|
|
|
|
|
|
|
buffer = file_import ("./test.x"); |
|
|
|
|
|
|
|
for (offset = 0; buffer [offset] != '\0'; ++offset) { |
|
|
|
if ((buffer [offset] == '-') && (buffer [offset + 1] == '-') && (buffer [offset + 2] == '-') && (buffer [offset + 1] != '\0') && (buffer [offset + 2] != '\0')) { |
|
|
|
for (; buffer [offset] != '\n'; ++offset); |
|
|
|
} else if (buffer [offset] == '"') { |
|
|
|
int size = 0; |
|
|
|
char data [STRING_LIMIT] = ""; |
|
|
|
for (++offset; (buffer [offset] != '"') && (buffer [offset] != '\0'); ++offset) { |
|
|
|
data [size++] = buffer [offset]; |
|
|
|
} |
|
|
|
data [size] = '\0'; |
|
|
|
add_token (core_string, string_code); |
|
|
|
add_string (data, size); |
|
|
|
} else if (character_is_digit (buffer [offset]) == true) { |
|
|
|
int data = buffer [offset] - '0'; |
|
|
|
for (++offset; (character_is_digit (buffer [offset]) == true) && (buffer [offset] != '\0'); ++offset) { |
|
|
|
data *= 10; |
|
|
|
data += (buffer [offset] - '0'); |
|
|
|
} |
|
|
|
add_token (core_number, number_code); |
|
|
|
add_number (data); |
|
|
|
--offset; |
|
|
|
} else if (character_is_alpha (buffer [offset]) == true) { |
|
|
|
int size = 0; |
|
|
|
char name [NAME_LIMIT] = ""; |
|
|
|
for (; ((character_is_alpha (buffer [offset]) == true) || |
|
|
|
(character_is_digit (buffer [offset]) == true) || |
|
|
|
(character_is_underscore (buffer [offset]) == true)) && (buffer [offset] != '\0'); ++offset) { |
|
|
|
name [size++] = buffer [offset]; |
|
|
|
} |
|
|
|
name [size] = '\0'; |
|
|
|
for (length = 0; length < 10; ++length) { |
|
|
|
if (string_compare_limit (name, word_list [length], string_length (word_list [length]) + 1) == true) { |
|
|
|
add_token (core_word, length); |
|
|
|
goto here; |
|
|
|
} |
|
|
|
} |
|
|
|
add_token (core_marker, marker_code); |
|
|
|
here: |
|
|
|
add_marker (name, token_type [token_count - 1]); |
|
|
|
--offset; |
|
|
|
} else if (character_compare_array (buffer [offset], ",.;:=<>&|+-*/%(){}") == true) { |
|
|
|
add_token (core_symbol, symbol_code); |
|
|
|
add_symbol (buffer [offset]); |
|
|
|
} else { |
|
|
|
if (character_is_blank (buffer [offset]) == false) { |
|
|
|
echo ("\033[1;31mSegmentation fault motherfucker!\033[0m\n"); |
|
|
|
printf ("%c -- %i\n", buffer [offset], (int) buffer [offset]); |
|
|
|
exit (log_failure); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (length = 0; length < token_count; ++length) { |
|
|
|
switch (token_type [length]) { |
|
|
|
case core_symbol: printf ("\033[1;34m%c\033[0m ", symbol_data [token_data [length]]); break; |
|
|
|
case core_string: printf ("\033[1;31m%s\033[0m ", string_data [token_data [length]]); break; |
|
|
|
case core_number: printf ("\033[1;32m%i\033[0m ", number_data [token_data [length]]); break; |
|
|
|
case core_marker: printf ("\033[1;33m%s\033[0m ", marker_name [token_data [length]]); break; |
|
|
|
case core_word: printf ("\033[1;35m%s\033[0m ", word_list [token_data [length]]); break; |
|
|
|
default: break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
printf ("\n"); |
|
|
|
|
|
|
|
for (length = 0; length < token_count; ++length) { |
|
|
|
if ((token_type [length] == core_word) && (token_data [length] == word_return)) { |
|
|
|
++length; |
|
|
|
if ((token_type [length] == core_symbol) && (symbol_data [token_data [length]] == '(')) { |
|
|
|
echo ("return (\n"); |
|
|
|
++length; |
|
|
|
} else if ((token_type [length] == core_symbol) && (symbol_data [token_data [length]] == ';')) { |
|
|
|
echo ("return ; -- 48 33 C0 3C -- xor rax rax ret\n"); |
|
|
|
++length; |
|
|
|
} else { |
|
|
|
kill ("return ?\n"); |
|
|
|
} |
|
|
|
} else if ((token_type [length] == core_word) && (token_data [length] == word_if)) { |
|
|
|
++length; |
|
|
|
if ((token_type [length] == core_symbol) && (symbol_data [token_data [length]] == '(')) { |
|
|
|
echo ("if (\n"); |
|
|
|
++length; |
|
|
|
} else { |
|
|
|
kill ("if ?\n"); |
|
|
|
} |
|
|
|
} else if ((token_type [length] == core_word) && (token_data [length] == word_else)) { |
|
|
|
++length; |
|
|
|
if ((token_type [length] == core_symbol) && (symbol_data [token_data [length]] == ':')) { |
|
|
|
echo ("else :\n"); |
|
|
|
++length; |
|
|
|
} else if ((token_type [length] == core_word) && (token_data [length] == word_if)) { |
|
|
|
echo ("else if\n"); |
|
|
|
++length; |
|
|
|
} else { |
|
|
|
kill ("else ?\n"); |
|
|
|
} |
|
|
|
} else if ((token_type [length] == core_word) && (token_data [length] == word_type)) { |
|
|
|
++length; |
|
|
|
if (token_type [length] == core_marker) { |
|
|
|
echo ("type <name> -- "); |
|
|
|
echo (marker_name [token_data [length]]); |
|
|
|
echo ("\n"); |
|
|
|
++length; |
|
|
|
} else { |
|
|
|
kill ("type ?\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (length = 0; length < string_code; ++length) { string_data [length] = deallocate (string_data [length]); } |
|
|
|
for (length = 0; length < marker_code; ++length) { marker_name [length] = deallocate (marker_name [length]); } |
|
|
|
|
|
|
|
string_data = deallocate (string_data); |
|
|
|
string_size = deallocate (string_size); |
|
|
|
marker_name = deallocate (marker_name); |
|
|
|
marker_type = deallocate (marker_type); |
|
|
|
symbol_data = deallocate (symbol_data); |
|
|
|
number_data = deallocate (number_data); |
|
|
|
token_data = deallocate (token_data); |
|
|
|
token_type = deallocate (token_type); |
|
|
|
|
|
|
|
buffer = deallocate (buffer); |
|
|
|
|
|
|
|
return (log_success); |
|
|
|
} |