static procedure language_highlight_eaxhla (language_structure * language, syntax_structure * syntax) {
	character * separators = ".,+-*/[]<>=; \t\r\n";

	character * declarations [] = {
		"program",      "procedure",    "machine",      "library",      "fast",         "unix",         "begin",        "end",
		"if",           "then",         "else",         "repeat",       "break",        "continue",     "until",        "exit",
		"fastcall",     "shell",        "alias",        "macro",        "scope",        "unscope",      "use",          "include"
	};

	character * types [] = {
		"integer_64",           "character6",          "s32",          "s64",          "natural_64",           "natural_86",          "u32",          "u64",
		"f32",          "f64",          "real_640",          "v0",           "character28",         "natural_828",         "integer_1656",         "natural_1656",
		"s512",         "u512"
	};

	character * instructions [] = {
		"jnpe",         "jpo",          "jnpo",         "jpe",          "jnb",           "jae",          "jnbe",          "ja",
		"jna",          "jbe",          "jnae",         "jb",           "jnl",           "jge",          "jnle",          "jg",
		"jng",          "jle",          "jnge",         "jl",           "cmovng",        "cmovle",       "cmovnge",       "cmovl",
		"cmovnpe",      "cmovpo",       "cmovnpo",      "cmovpe",       "cmovnb",        "cmovae",       "cmovnbe",       "cmova",
		"cmovna",       "cmovbe",       "cmovnae",      "cmovb",        "cmovnl",        "cmovge",       "cmovnle",       "cmovg",
		"setnpe",       "setpo",        "setnpo",       "setpe",        "setnb",         "setae",        "setnbe",        "seta",
		"setna",        "setbe",        "setnae",       "setb",         "setnl",         "setge",        "setnle",        "setg",
		"setng",        "setle",        "setnge",       "setl",         "enter",         "call",         "jmp",           "mov",
		"add",          "or",           "adc",          "sbb",          "and",           "sub",          "xor",           "cmp",
		"inc",          "dec",          "not",          "neg",          "mul",           "imul",         "div",           "idiv",
		"fadd",         "fmul",         "fcom",         "fcomp",        "fsub",          "fsubr",        "fdiv",          "fdivr",
		"rol",          "ror",          "rcl",          "rcr",          "sal",           "shr",          "shl",           "sar",
		"nop",          "retn",         "retf",         "leave",        "popf",          "pushf",        "in",            "out",
		"syscall",      "cpuid",        "fnop",         "fchs",         "fabs",          "ftst",         "fxam",          "fld1",
		"fldl2t",       "fldl2e",       "fldpi",        "fldlg2",       "fldln2",        "fldz",         "f2xm1",         "fyl2x",
		"fptan",        "fpatan",       "fxtract",      "fprem1",       "fdecstp",       "fincstp",      "fprem",         "fyl2xp1",
		"fsqrt",        "fsincos",      "frndint",      "fscale",       "fsin",          "fcos",         "pop",           "push",
		"bswap",        "bsf",          "bsr",          "loop",         "loope",         "loopne"
	};

	character * registers [] = {
		"rax",          "rcx",          "rdx",          "rbx",          "rsp",          "rbp",          "rsi",          "rdi",
		"r8",           "r9",           "r10",          "r11",          "r12",          "r13",          "r14",          "r15",
		"eax",          "ecx",          "edx",          "ebx",          "esp",          "ebp",          "esi",          "edi",
		"r8d",          "r9d",          "r10d",         "r11d",         "r12d",         "r13d",         "r14d",         "r15d",
		"ax",           "cx",           "dx",           "bx",           "sp",           "bp",           "si",           "di",
		"r8w",          "r9w",          "r10w",         "r11w",         "r12w",         "r13w",         "r14w",         "r15w",
		"al",           "cl",           "dl",           "bl",           "spl",          "bpl",          "sil",          "dil",
		"r8b",          "r9b",          "r10b",         "r11b",         "r12b",         "r13b",         "r14b",         "r15b"
	};

	integer word;

	syntax_define (syntax, false, false, "#",   "\n", '\0', language->comment_colour,   language->comment_effect);
	syntax_define (syntax, false, false, "---", "\n", '\0', language->comment_colour,   language->comment_effect);
	syntax_define (syntax, false, false, "//",  "\n", '\0', language->comment_colour,   language->comment_effect);
	syntax_define (syntax, false, false, "'",   "'",  '\\', language->character_colour, language->character_effect);
	syntax_define (syntax, false, false, "\"",  "\"", '\\', language->string_colour,    language->string_effect);

	for (natural_64 word = 0; word < array_length (declarations); ++word) {
		syntax_define (syntax, false, true, declarations [word], separators, '\0', language->keyword_colour, language->keyword_effect);
	}

	for (natural_64 word = 0; word < array_length (types); ++word) {
		syntax_define (syntax, false, true, types [word], separators, '\0', language->type_colour, language->type_effect);
	}

	for (natural_64 word = 0; word < array_length (instructions); ++word) {
		syntax_define (syntax, false, true, instructions [word], " \t\n", '\0', language->extension_colour, language->extension_effect);
	}

	for (natural_64 word = 0; word < array_length (registers); ++word) {
		syntax_define (syntax, false, true, registers [word], separators, '\0', language->register_colour, language->register_effect);
	}

	syntax_define (syntax, true, false, "()[]{}",       "", '\0', language->bracket_colour,  language->bracket_effect);
	syntax_define (syntax, true, false, ".,+*-/%$<>=;", "", '\0', language->operator_colour, language->operator_effect);

	syntax_define (syntax, true, true, language_digits,    separators, '\0', language->number_colour,     language->number_effect);
	syntax_define (syntax, true, true, language_lowercase, separators, '\0', language->lowercase_colour,  language->lowercase_effect);
	syntax_define (syntax, true, true, language_uppercase, separators, '\0', language->uppercase_colour,  language->uppercase_effect);
	syntax_define (syntax, true, true, "_",                separators, '\0', language->underscore_colour, language->underscore_effect);
}