static procedure language_highlight_ada (language_structure * language, syntax_structure * syntax) {
	character * separators = ".,:;<=>+-*/&|()\" \t\r\n";

	character * keywords [] = {
		"abort",        "else",         "new",          "return",       "abs",          "elsif",        "not",          "reverse",
		"abstract",     "end",          "null",         "accept",       "entry",        "select",       "access",       "of",
		"separate",     "aliased",      "exit",         "or",           "some",         "all",          "others",       "subtype",
		"and",          "for",          "out",          "array",        "function",     "at",           "tagged",       "generic",
		"package",      "task",         "begin",        "goto",         "pragma",       "body",         "private",      "then",
		"type",         "case",         "in",           "constant",     "until",        "is",           "raise",        "use",
		"if",           "declare",      "range",        "delay",        "limited",      "record",       "when",         "delta",
		"loop",         "rem",          "while",        "digits",       "renames",      "with",         "do",           "mod",
		"requeue",      "xor",          "procedure",    "protected",    "interface",    "synchronized", "exception",    "overriding",
		"terminate"
	};

	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 (keywords); ++word) {
		syntax_define (syntax, false, true, keywords [word], separators, '\0', language->keyword_colour, language->keyword_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_letters, separators, '\0', language->lowercase_colour, language->lowercase_effect);
}