static procedure language_highlight_python (language_structure * language, syntax_structure * syntax) {
	character * separators = ".,:;<=>+-*/%!&~^?|()[]{}'\" \t\r\n";

	character * keywords [] = {
		"and",          "as",           "assert",       "break",        "class",        "continue",     "def",          "del",
		"elif",         "else",         "except",       "False",        "finally",      "for",          "from",         "global",
		"if",           "import",       "in",           "is",           "labmda",       "None",         "nonlocal",     "not",
		"or",           "pass",         "raise",        "return",       "True",         "try",          "while",        "with",
		"yield",        "async",        "await"
	};

	character * commons [] = {
		"abs",          "all",          "any",          "apply",        "ascii",        "basestring",   "bin",          "boolean",
		"breakpoint",   "buffer",       "bytearray",    "bytes",        "callable",     "chr",          "classmethod",  "cmp",
		"coerce",       "compile",      "complex",      "copyright",    "credits",      "delattr",      "dict",         "dir",
		"divmod",       "enumerate",    "eval",         "execfile",     "exit",         "file",         "filter",       "float",
		"format",       "frozenset",    "getattr",      "globals",      "hasattr",      "hash",         "help",         "hex",
		"id",           "input",        "int",          "intern",       "isinstance",   "issubclass",   "iter",         "len",
		"license",      "list",         "locals",       "long",         "map",          "max",          "memoryview",   "min",
		"next",         "object",       "oct",          "open",         "ord",          "pow",          "property",     "quit",
		"range",        "raw_input",    "reduce",       "reload",       "repr",         "reversed",     "round",        "set",
		"setattr",      "slice",        "sorted",       "staticmethod", "str",          "sum",          "super",        "tuple",
		"type",         "unichr",       "unicode",      "vars",         "xrange",       "zip"
	};

	syntax_define (syntax, false, false, "#",       "\n",     '\0', language->comment_colour,   language->comment_effect);
	syntax_define (syntax, false, false, "'''",     "'''",    '\0', language->comment_colour,   language->comment_effect);
	syntax_define (syntax, false, false, "\"\"\"",  "\"\"\"", '\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);
	}

	for (natural_64 word = 0; word < array_length (commons); ++word) {
		syntax_define (syntax, false, true, commons [word], separators, '\0', language->extension_colour, language->extension_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);
}