#include <eepp/ui/doc/languages/freebasic.hpp>
#include <eepp/ui/doc/syntaxdefinitionmanager.hpp>

namespace EE { namespace UI { namespace Doc { namespace Language {

SyntaxDefinition& addFreeBASIC() {

	auto& sd = SyntaxDefinitionManager::instance()->add(

		{ "FreeBASIC",
		  { "%.bas$", "%.bi$" },
		  {
			  { { "'.*" }, "comment" },
			  { { "rem%s.*" }, "comment" },
			  { { "\"", "\"" }, "string" },
			  { { "-?&H%x+" }, "number" },
			  { { "-?%d+[%d%.eE]*" }, "number" },
			  { { "-?%.?%d+f?" }, "number" },
			  { { "[%a_][%w_]*%s*%f[(]" }, "function" },
			  { { "[=><%+%-%*%^&:%.,_%(%)]" }, "operator" },
			  { { "#?[%a_][%w_]*" }, "symbol" },

		  },
		  {

			  { "abs", "keyword" },
			  { "access", "keyword" },
			  { "acos", "keyword" },
			  { "alias", "keyword" },
			  { "allocate", "keyword" },
			  { "alpha", "keyword" },
			  { "and", "keyword" },
			  { "andalso", "keyword" },
			  { "any", "keyword" },
			  { "append", "keyword" },
			  { "as", "keyword" },
			  { "asc", "keyword" },
			  { "asin", "keyword" },
			  { "asm", "keyword" },
			  { "assert", "keyword" },
			  { "assertwarn", "keyword" },
			  { "atan2", "keyword" },
			  { "atn", "keyword" },
			  { "base", "keyword" },
			  { "beep", "keyword" },
			  { "bin", "keyword" },
			  { "binary", "keyword" },
			  { "bit", "keyword" },
			  { "bitreset", "keyword" },
			  { "bitset", "keyword" },
			  { "bload", "keyword" },
			  { "boolean", "keyword" },
			  { "bsave", "keyword" },
			  { "byref", "keyword" },
			  { "byte", "keyword" },
			  { "byval", "keyword" },
			  { "call", "keyword" },
			  { "callocate", "keyword" },
			  { "case", "keyword" },
			  { "cast", "keyword" },
			  { "cbyte", "keyword" },
			  { "cdbl", "keyword" },
			  { "cdecl", "keyword" },
			  { "chain", "keyword" },
			  { "chdir", "keyword" },
			  { "chr", "keyword" },
			  { "cint", "keyword" },
			  { "circle", "keyword" },
			  { "class", "keyword" },
			  { "clear", "keyword" },
			  { "clng", "keyword" },
			  { "clngint", "keyword" },
			  { "close", "keyword" },
			  { "cls", "keyword" },
			  { "color", "keyword" },
			  { "com", "keyword" },
			  { "command", "keyword" },
			  { "common", "keyword" },
			  { "condbroadcast", "keyword" },
			  { "condcreate", "keyword" },
			  { "conddestroy", "keyword" },
			  { "condsignal", "keyword" },
			  { "condwait", "keyword" },
			  { "cons", "keyword" },
			  { "const", "keyword" },
			  { "constructor", "keyword" },
			  { "continue", "keyword" },
			  { "cos", "keyword" },
			  { "cptr", "keyword" },
			  { "cshort", "keyword" },
			  { "csign", "keyword" },
			  { "csng", "keyword" },
			  { "csrlin", "keyword" },
			  { "cubyte", "keyword" },
			  { "cuint", "keyword" },
			  { "culng", "keyword" },
			  { "culngint", "keyword" },
			  { "cunsg", "keyword" },
			  { "curdir", "keyword" },
			  { "cushort", "keyword" },
			  { "custom", "keyword" },
			  { "cvd", "keyword" },
			  { "cvi", "keyword" },
			  { "cvl", "keyword" },
			  { "cvlongint", "keyword" },
			  { "cvs", "keyword" },
			  { "cvshort", "keyword" },
			  { "data", "keyword" },
			  { "date", "keyword" },
			  { "dateadd", "keyword" },
			  { "datediff", "keyword" },
			  { "datepart", "keyword" },
			  { "dateserial", "keyword" },
			  { "datevalue", "keyword" },
			  { "day", "keyword" },
			  { "deallocate", "keyword" },
			  { "declare", "keyword" },
			  { "defbyte", "keyword" },
			  { "defdbl", "keyword" },
			  { "define", "keyword" },
			  { "defined", "keyword" },
			  { "defint", "keyword" },
			  { "deflng", "keyword" },
			  { "deflngint", "keyword" },
			  { "defshort", "keyword" },
			  { "defsng", "keyword" },
			  { "defstr", "keyword" },
			  { "defubyte", "keyword" },
			  { "defuint", "keyword" },
			  { "defulngint", "keyword" },
			  { "defushort", "keyword" },
			  { "delete", "keyword" },
			  { "destructor", "keyword" },
			  { "dim", "keyword" },
			  { "dir", "keyword" },
			  { "do", "keyword" },
			  { "double", "keyword" },
			  { "draw", "keyword" },
			  { "dylibfree", "keyword" },
			  { "dylibload", "keyword" },
			  { "dylibsymbol", "keyword" },
			  { "dynamic", "keyword" },
			  { "else", "keyword" },
			  { "elseif", "keyword" },
			  { "encoding", "keyword" },
			  { "end", "keyword" },
			  { "endif", "keyword" },
			  { "endmacro", "keyword" },
			  { "enum", "keyword" },
			  { "environ", "keyword" },
			  { "eof", "keyword" },
			  { "eqv", "keyword" },
			  { "erase", "keyword" },
			  { "erfn", "keyword" },
			  { "erl", "keyword" },
			  { "ermn", "keyword" },
			  { "err", "keyword" },
			  { "error", "keyword" },
			  { "escape", "keyword" },
			  { "exec", "keyword" },
			  { "exepath", "keyword" },
			  { "exit", "keyword" },
			  { "exp", "keyword" },
			  { "explicit", "keyword" },
			  { "export", "keyword" },
			  { "extends", "keyword" },
			  { "extern", "keyword" },
			  { "false", "keyword" },
			  { "fboolean", "keyword" },
			  { "field", "keyword" },
			  { "fileattr", "keyword" },
			  { "filecopy", "keyword" },
			  { "filedatetime", "keyword" },
			  { "fileexists", "keyword" },
			  { "filelen", "keyword" },
			  { "fix", "keyword" },
			  { "flip", "keyword" },
			  { "for", "keyword" },
			  { "format", "keyword" },
			  { "frac", "keyword" },
			  { "fre", "keyword" },
			  { "freefile", "keyword" },
			  { "function", "keyword" },
			  { "get", "keyword" },
			  { "getjoystick", "keyword" },
			  { "getkey", "keyword" },
			  { "getmouse", "keyword" },
			  { "gosub", "keyword" },
			  { "goto", "keyword" },
			  { "hex", "keyword" },
			  { "hibyte", "keyword" },
			  { "hiword", "keyword" },
			  { "hour", "keyword" },
			  { "if", "keyword" },
			  { "ifdef", "keyword" },
			  { "ifndef", "keyword" },
			  { "iif", "keyword" },
			  { "imageconvertrow", "keyword" },
			  { "imagecreate", "keyword" },
			  { "imagedestroy", "keyword" },
			  { "imp", "keyword" },
			  { "import", "keyword" },
			  { "inclib", "keyword" },
			  { "include", "keyword" },
			  { "inkey", "keyword" },
			  { "inp", "keyword" },
			  { "input", "keyword" },
			  { "instr", "keyword" },
			  { "instrrev", "keyword" },
			  { "int", "keyword" },
			  { "integer", "keyword" },
			  { "interface", "keyword" },
			  { "is", "keyword" },
			  { "isdate", "keyword" },
			  { "kill", "keyword" },
			  { "lang", "keyword" },
			  { "lbound", "keyword" },
			  { "lcase", "keyword" },
			  { "left", "keyword" },
			  { "len", "keyword" },
			  { "let", "keyword" },
			  { "lib", "keyword" },
			  { "libpath", "keyword" },
			  { "line", "keyword" },
			  { "lobyte", "keyword" },
			  { "loc", "keyword" },
			  { "local", "keyword" },
			  { "locate", "keyword" },
			  { "lock", "keyword" },
			  { "lof", "keyword" },
			  { "log", "keyword" },
			  { "long", "keyword" },
			  { "longint", "keyword" },
			  { "loop", "keyword" },
			  { "loword", "keyword" },
			  { "lpos", "keyword" },
			  { "lprint", "keyword" },
			  { "lpt", "keyword" },
			  { "lset", "keyword" },
			  { "ltrim", "keyword" },
			  { "macro", "keyword" },
			  { "mid", "keyword" },
			  { "minute", "keyword" },
			  { "mkd", "keyword" },
			  { "mkdir", "keyword" },
			  { "mki", "keyword" },
			  { "mkl", "keyword" },
			  { "mklongint", "keyword" },
			  { "mks", "keyword" },
			  { "mkshort", "keyword" },
			  { "mod", "keyword" },
			  { "month", "keyword" },
			  { "monthname", "keyword" },
			  { "multikey", "keyword" },
			  { "mutexcreate", "keyword" },
			  { "mutexdestroy", "keyword" },
			  { "mutexlock", "keyword" },
			  { "mutexunlock", "keyword" },
			  { "name", "keyword" },
			  { "namespace", "keyword" },
			  { "new", "keyword" },
			  { "next", "keyword" },
			  { "nokeyword", "keyword" },
			  { "not", "keyword" },
			  { "now", "keyword" },
			  { "object", "keyword" },
			  { "oct", "keyword" },
			  { "offsetof", "keyword" },
			  { "on", "keyword" },
			  { "once", "keyword" },
			  { "open", "keyword" },
			  { "operator", "keyword" },
			  { "option", "keyword" },
			  { "or", "keyword" },
			  { "orelse", "keyword" },
			  { "out", "keyword" },
			  { "output", "keyword" },
			  { "overload", "keyword" },
			  { "paint", "keyword" },
			  { "palette", "keyword" },
			  { "pascal", "keyword" },
			  { "pcopy", "keyword" },
			  { "peek", "keyword" },
			  { "pipe", "keyword" },
			  { "pmap", "keyword" },
			  { "point", "keyword" },
			  { "pointer", "keyword" },
			  { "poke", "keyword" },
			  { "pos", "keyword" },
			  { "pragma", "keyword" },
			  { "preserve", "keyword" },
			  { "preset", "keyword" },
			  { "print", "keyword" },
			  { "private", "keyword" },
			  { "procptr", "keyword" },
			  { "property", "keyword" },
			  { "protected", "keyword" },
			  { "pset", "keyword" },
			  { "ptr", "keyword" },
			  { "public", "keyword" },
			  { "put", "keyword" },
			  { "random", "keyword" },
			  { "randomize", "keyword" },
			  { "read", "keyword" },
			  { "reallocate", "keyword" },
			  { "redim", "keyword" },
			  { "reset", "keyword" },
			  { "restore", "keyword" },
			  { "resume", "keyword" },
			  { "return", "keyword" },
			  { "rgb", "keyword" },
			  { "rgba", "keyword" },
			  { "right", "keyword" },
			  { "rmdir", "keyword" },
			  { "rnd", "keyword" },
			  { "rset", "keyword" },
			  { "rtrim", "keyword" },
			  { "run", "keyword" },
			  { "sadd", "keyword" },
			  { "scope", "keyword" },
			  { "screen", "keyword" },
			  { "screencontrol", "keyword" },
			  { "screencopy", "keyword" },
			  { "screenevent", "keyword" },
			  { "screenglproc", "keyword" },
			  { "screeninfo", "keyword" },
			  { "screenlist", "keyword" },
			  { "screenlock", "keyword" },
			  { "screenptr", "keyword" },
			  { "screenres", "keyword" },
			  { "screenset", "keyword" },
			  { "screensync", "keyword" },
			  { "screenunlock", "keyword" },
			  { "scrn", "keyword" },
			  { "second", "keyword" },
			  { "seek", "keyword" },
			  { "select", "keyword" },
			  { "setdate", "keyword" },
			  { "setenviron", "keyword" },
			  { "setmouse", "keyword" },
			  { "settime", "keyword" },
			  { "sgn", "keyword" },
			  { "shared", "keyword" },
			  { "shell", "keyword" },
			  { "shl", "keyword" },
			  { "short", "keyword" },
			  { "shr", "keyword" },
			  { "sin", "keyword" },
			  { "single", "keyword" },
			  { "sizeof", "keyword" },
			  { "sleep", "keyword" },
			  { "space", "keyword" },
			  { "spc", "keyword" },
			  { "sqr", "keyword" },
			  { "static", "keyword" },
			  { "stdcall", "keyword" },
			  { "step", "keyword" },
			  { "stop", "keyword" },
			  { "str", "keyword" },
			  { "string", "keyword" },
			  { "strptr", "keyword" },
			  { "sub", "keyword" },
			  { "swap", "keyword" },
			  { "system", "keyword" },
			  { "tab", "keyword" },
			  { "tan", "keyword" },
			  { "then", "keyword" },
			  { "this", "keyword" },
			  { "threadcreate", "keyword" },
			  { "threadwait", "keyword" },
			  { "time", "keyword" },
			  { "timer", "keyword" },
			  { "timeserial", "keyword" },
			  { "timevalue", "keyword" },
			  { "to", "keyword" },
			  { "trans", "keyword" },
			  { "trim", "keyword" },
			  { "true", "keyword" },
			  { "type", "keyword" },
			  { "typeof", "keyword" },
			  { "ubound", "keyword" },
			  { "ubyte", "keyword" },
			  { "ucase", "keyword" },
			  { "uinteger", "keyword" },
			  { "ulong", "keyword" },
			  { "ulongint", "keyword" },
			  { "undef", "keyword" },
			  { "union", "keyword" },
			  { "unlock", "keyword" },
			  { "unsigned", "keyword" },
			  { "until", "keyword" },
			  { "ushort", "keyword" },
			  { "using", "keyword" },
			  { "va_arg", "keyword" },
			  { "va_first", "keyword" },
			  { "va_next", "keyword" },
			  { "val", "keyword" },
			  { "valint", "keyword" },
			  { "vallng", "keyword" },
			  { "valuint", "keyword" },
			  { "valulng", "keyword" },
			  { "var", "keyword" },
			  { "varptr", "keyword" },
			  { "view", "keyword" },
			  { "virtual", "keyword" },
			  { "wait", "keyword" },
			  { "wbin", "keyword" },
			  { "wchr", "keyword" },
			  { "weekday", "keyword" },
			  { "weekdayname", "keyword" },
			  { "wend", "keyword" },
			  { "whex", "keyword" },
			  { "while", "keyword" },
			  { "width", "keyword" },
			  { "window", "keyword" },
			  { "windowtitle", "keyword" },
			  { "winput", "keyword" },
			  { "with", "keyword" },
			  { "woct", "keyword" },
			  { "write", "keyword" },
			  { "wspace", "keyword" },
			  { "wstr", "keyword" },
			  { "wstring", "keyword" },
			  { "xor", "keyword" },
			  { "year", "keyword" },
			  { "zstring", "keyword" },

			  { "#if", "keyword" },
			  { "#ifdef", "keyword" },
			  { "#ifndef", "keyword" },
			  { "#elseif", "keyword" },
			  { "#elseifdef", "keyword" },
			  { "#elseifndef", "keyword" },
			  { "#else", "keyword" },
			  { "#endif", "keyword" },
			  { "#define", "keyword" },
			  { "#macro", "keyword" },
			  { "#endmacro", "keyword" },
			  { "#undef", "keyword" },
			  { "#include", "keyword" },
			  { "#include once", "keyword" },
			  { "#inclib", "keyword" },
			  { "#libpath", "keyword" },
			  { "#pragma", "keyword" },
			  { "#pragma reserve", "keyword" },
			  { "#cmdline", "keyword" },
			  { "#lang", "keyword" },
			  { "#print", "keyword" },
			  { "#error", "keyword" },
			  { "#assert", "keyword" },
			  { "#line", "keyword" },

		  },
		  "'",
		  {}

		} );

	sd.setCaseInsensitive( true );
	return sd;
}

}}}} // namespace EE::UI::Doc::Language
