static procedure language_highlight_flat (language_structure * language, syntax_structure * syntax) {
	character * separators = ".,+-=:;(){}[]%$<> \t\r\n";

	character * declarations [] = {
		"format",       "executable",   "readable",     "writable",     "segment",      "sector",       "entry",        "macro",
		"db",           "dw",           "dd",           "dq",           "rb",           "rw",           "rd",           "rq"
	};

	character * instructions [] = {
		"mov",          "movabs",       "movapd",       "movaps",       "movebe",       "movsd",        "movsx",        "movzx",
		"movsxd",       "movd",         "movq",         "movs",         "movsb",        "movsw",        "movsd",        "movsq",
		"cmovmp",       "cmovrcxz",     "cmovc",        "cmovnc",       "cmove",        "cmovne",       "cmovz",        "cmovnz",
		"cmovg",        "cmovng",       "cmovge",       "cmovnge",      "cmovl",        "cmovnl",       "cmovle",       "cmovnle",
		"cmova",        "cmovna",       "cmovae",       "cmovnae",      "cmovb",        "cmovnb",       "cmovbe",       "cmovnbe",
		"cmovs",        "cmovns",       "cmovo",        "cmovno",       "cmovp",        "cmovnp",       "cmovpo",       "cmovpe",
		"cmp",          "cmps",         "cmpsb",        "cmpsw",        "cmpsd",        "cmpsq",        "cmpxchg",      "lea",
		"monitor",      "cpuid",        "in",           "out",          "syscall",      "sysenter",     "sysret",       "sysexit",
		"swap",         "bswap",        "pop",          "push",         "call",         "ret",          "enter",        "leave",
		"and",          "or",           "not",          "neg",          "sal",          "sar",          "shl",          "shr",
		"inc",          "dec",          "add",          "sub",          "mul",          "div",          "imul",         "idiv",
		"nop",          "fnop",         "adc",          "sbb",          "aaa",          "aas",          "aam",          "aad",
		"jmp",          "jrcxz",        "jc",           "jnc",          "je",           "jne",          "jz",           "jnz",
		"jg",           "jng",          "jge",          "jnge",         "jl",           "jnl",          "jle",          "jnle",
		"ja",           "jna",          "jae",          "jnae",         "jb",           "jnb",          "jbe",          "jnbe",
		"js",           "jns",          "jo",           "jno",          "jp",           "jnp",          "jpo",          "jpe",
		"rep",          "repe",         "repz",         "repne",        "repnz",        "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",
		"ah",           "ch",           "dh",           "bh"
	};

	integer word;

	syntax_define (syntax, false, false, ";",  "\n", '\0', language->comment_colour, language->comment_effect);
	syntax_define (syntax, false, false, "'",  "'",  '\\', language->string_colour,  language->string_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 (instructions); ++word) {
		syntax_define (syntax, false, true, instructions [word], " \t", '\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);
}