/++ + compile time lexer + + Authors: mikanya + Copyright: mikanya + License: NYSL Version 0.9982 +/ module meta.lexer; import std.stdio; import std.metastrings; template ParseEndOfLine(const char[] src) { static if(src.length == 0) { const ParseEndOfLine = ""; } else static if(src.length >= 2 && src[0 .. 2] == "\r\n") { const ParseEndOfLine = src[0 .. 2]; } else static if(src[0] == 0x000D || src[0] == 0x000A) { const ParseEndOfLine = "" ~ src[0]; } else { const ParseEndOfLine = ""; } } template ParseSpace(const char[] src) { static if(src.length == 0) { const ParseSpace = ""; } else static if(src[0] == 0x0020 || src[0] == 0x0009 || src[0] == 0x000B || src[0] == 0x000C) { const ParseSpace = "" ~ src[0]; } else { const ParseSpace = ""; } } template ParseWhiteSpace(const char[] src) { static if(src.length == 0) { const ParseWhiteSpace = ""; } else static if(ParseSpace!(src) != "") { const ParseWhiteSpace = ParseSpace!(src) ~ ParseWhiteSpace!(src[ParseSpace!(src).length .. $]); } else { const ParseWhiteSpace = ""; } } template ParseLineComment(const char[] src) { static if(src.length == 0) { const ParseLineComment = ""; } else static if(src.length >= 2 && src[0 .. 2] == "//") { const ParseLineComment = src[0 .. 2] ~ ParseLineCommentHelper!(src[2 .. $]); } else { const ParseLineComment = ""; } } template ParseLineCommentHelper(const char[] src) { static if(src.length == 0) { const ParseLineCommentHelper = ""; } else static if(ParseEndOfLine!(src) != "") { const ParseLineCommentHelper = ParseEndOfLine!(src); } else { const ParseLineCommentHelper = src[0] ~ ParseLineCommentHelper!(src[1..$]); } } template ParseBlockComment(const char[] src) { static if(src.length == 0) { const ParseBlockComment = ""; } else static if(src.length >= 2 && src[0 .. 2] == "/*") { const ParseBlockComment = src[0 .. 2] ~ ParseBlockCommentHelper!(src[2 .. $]); } else { const ParseBlockComment = ""; } } template ParseBlockCommentHelper(const char[] src) { static if(src.length == 0) { const ParseBlockCommentHelper = ""; } else static if(/*src.length >= 2 &&*/ src[0 .. 2] == "*/") { const ParseBlockCommentHelper = src[0 .. 2]; } else { const ParseBlockCommentHelper = src[0] ~ ParseBlockCommentHelper!(src[1 .. $]); } } template ParseNestingBlockComment(const char[] src) { static if(src.length == 0) { const ParseNestingBlockComment = ""; } else static if(src.length >= 2 && src[0 .. 2] == "/+") { const ParseNestingBlockComment = src[0 .. 2] ~ ParseNestingBlockCommentHelper!(src[2 .. $]); } else { const ParseNestingBlockComment = ""; } } template ParseNestingBlockCommentHelper(const char[] src) { static if(src.length == 0) { const ParseNestingBlockCommentHelper = ""; } else static if(src[0 .. 2] == "+/") { const ParseNestingBlockCommentHelper = "" ~ src[0 .. 2]; } else static if(src[0 .. 2] == "/+") { const ParseNestingBlockCommentHelper = ParseNestingBlockComment!(src) ~ ParseNestingBlockCommentHelper!(src[ParseNestingBlockComment!(src).length .. $]); } else { const ParseNestingBlockCommentHelper = src[0] ~ ParseNestingBlockCommentHelper!(src[1 .. $]); } } template ParseComment(const char[] src) { static if(src.length == 0) { const ParseComment = ""; } else static if(ParseBlockComment!(src) != "") { const ParseComment = ParseBlockComment!(src); } else static if(ParseLineComment!(src) != "") { const ParseComment = ParseLineComment!(src); } else static if(ParseNestingBlockComment!(src) != "") { const ParseComment = ParseNestingBlockComment!(src); } else { const ParseComment = ""; } } template ParseToken(const char[] src) { static if(src.length == 0) { const ParseToken = ""; } else static if(ParseWhiteSpace!(src) != "") { const ParseToken = ""; } else static if(ParseComment!(src) != "") { const ParseToken = ""; } else static if(ParseEndOfLine!(src) != "") { const ParseToken = ""; } else static if(ParseIdentifier!(src) != "") { const ParseToken = ParseIdentifier!(src); } /+ else static if(ParseKeyword!(src) != "") { const ParseToken = ParseKeyword!(src); } +/ else static if(ParseStringLiteral!(src) != "") { const ParseToken = ParseStringLiteral!(src); } else static if(ParseIntegerLiteral!(src) != "") { const ParseToken = ParseIntegerLiteral!(src); } else static if(ParseOperator!(src) != "") { const ParseToken = ParseOperator!(src); } else { //const ParseToken = src[0] ~ ParseToken!(src[1 .. $]); //const ParseToken = ParseToken!(src[1 .. $]); const ParseToken = ""; } } template lexer(const char[] src) { static if(src.length == 0) { const lexer = ""; } else static if(ParseWhiteSpace!(src) != "") { //const lexer = "" ~ lexer!(src[ParseWhiteSpace!(src).length .. $]); const lexer = lexer!(src[ParseWhiteSpace!(src).length .. $]); } else static if(ParseComment!(src) != "") { //const lexer = "" ~ lexer!(src[ParseComment!(src).length .. $]); const lexer = lexer!(src[ParseComment!(src).length .. $]); } else static if(ParseEndOfLine!(src) != "") { //const lexer = "" ~ lexer!(src[ParseEndOfLine!(src).length .. $]); const lexer = lexer!(src[ParseEndOfLine!(src).length .. $]); } else static if(ParseToken!(src) != "") { pragma(msg,""); //const lexer = "" ~ lexer!(src[ParseToken!(src).length .. $]); const lexer = lexer!(src[ParseToken!(src).length .. $]); } else { //pragma(msg,src); const lexer = ""; } } template ParseIdentifier(const char[] src) { static if(src.length == 0) { const ParseIdentifier = ""; } else static if(src[0] == '_' || (src[0] >= 'a' && src[0] <= 'z') || (src[0] >= 'A' && src[0] <= 'Z')) { const ParseIdentifier = src[0] ~ ParseIdentifierHelper!(src[1 .. $]); } else { const ParseIdentifier = ""; } } template ParseIdentifierHelper(const char[] src) { static if(src.length == 0) { const ParseIdentifierHelper = ""; } else static if(src[0] == '_' || (src[0] >= 'a' && src[0] <= 'z') || (src[0] >= 'A' && src[0] <= 'Z') || src[0] == '0' || (src[0] >= '1' && src[0] <= '9')) { const ParseIdentifierHelper = src[0] ~ ParseIdentifierHelper!(src[1 .. $]); } else { const ParseIdentifierHelper = ""; } } template ParseStringLiteral(const char[] src) { static if(src.length == 0) { const ParseStringLiteral = ""; } else static if(ParseAlternateWysiwygString!(src) != "") { const ParseStringLiteral = ParseAlternateWysiwygString!(src); } else static if(ParseDoubleQuotedString!(src) != "") { const ParseStringLiteral = ParseDoubleQuotedString!(src); } else { const ParseStringLiteral = ""; } } template ParseAlternateWysiwygString(const char[] src) { static if(src.length == 0) { const ParseAlternateWysiwygString = ""; } else static if(src[0] == '`') { const ParseAlternateWysiwygString = src[0] ~ ParseAlternateWysiwygStringHelper!(src[1 .. $]); } else { const ParseAlternateWysiwygString = ""; } } template ParseAlternateWysiwygStringHelper(const char[] src) { static if(src.length == 0) { const ParseAlternateWysiwygStringHelper = ""; } else static if(src[0] == '`') { const ParseAlternateWysiwygStringHelper = "" ~ src[0]; } else { const ParseAlternateWysiwygStringHelper = src[0] ~ ParseAlternateWysiwygStringHelper!(src[1 .. $]); } } template ParseDoubleQuotedString(const char[] src) { static if(src.length == 0) { const ParseDoubleQuotedString = ""; } else static if(src[0] == '\"') { const ParseDoubleQuotedString = src[0] ~ ParseDoubleQuotedStringHelper!(src[1 .. $]); } else { const ParseDoubleQuotedString = ""; } } template ParseDoubleQuotedStringHelper(const char[] src) { static if(src.length == 0) { const ParseDoubleQuotedStringHelper = ""; } else static if(src[0] == '\"') { const ParseDoubleQuotedStringHelper = "" ~ src[0]; } else { const ParseDoubleQuotedStringHelper = src[0] ~ ParseDoubleQuotedStringHelper!(src[1 .. $]); } } template ParseIntegerLiteral(const char[] src) { static if(src.length == 0) { const ParseIntegerLiteral = ""; } else static if(ParseDecimal!(src) != "") { const ParseIntegerLiteral = ParseDecimal!(src); } else { const ParseIntegerLiteral = ""; } } template ParseDecimal(const char[] src) { static if(src.length == 0) { const ParseDecimal = ""; } else static if(src[0] == '0' || (src[0] >= '1' && src[0] <= '9')) { const ParseDecimal = src[0] ~ ParseDecimal!(src[1 .. $]); } else { const ParseDecimal = ""; } } template ParseOperator(const char[] src) { static if(src.length == 0) { const ParseOperator = ""; } else static if(src[0 .. 2] == "/=") { const ParseOperator = "" ~ "/="; } else static if(src[0] == '/') { const ParseOperator = "" ~ '/'; } else static if(src.length >= 3 && src[0 .. 3] == "...") { const ParseOperator = "" ~ "..."; } else static if(src[0 .. 2] == "..") { const ParseOperator = "" ~ ".."; } else static if(src[0] == '.') { const ParseOperator = "" ~ '.'; } else static if(src[0 .. 2] == "&=") { const ParseOperator = "" ~ "&="; } else static if(src[0 .. 2] == "&&") { const ParseOperator = "" ~ "&&"; } else static if(src[0] == '&') { const ParseOperator = "" ~ '&'; } else static if(src[0 .. 2] == "|=") { const ParseOperator = "" ~ "|="; } else static if(src[0 .. 2] == "||") { const ParseOperator = "" ~ "||"; } else static if(src[0] == '|') { const ParseOperator = "" ~ '|'; } else static if(src[0 .. 2] == "-=") { const ParseOperator = "" ~ "-="; } else static if(src[0 .. 2] == "--") { const ParseOperator = "" ~ "--"; } else static if(src[0] == '-') { const ParseOperator = "" ~ '-'; } else static if(src[0 .. 2] == "+=") { const ParseOperator = "" ~ "+="; } else static if(src[0 .. 2] == "++") { const ParseOperator = "" ~ "++"; } else static if(src[0] == '+') { const ParseOperator = "" ~ '+'; } else static if(src.length >= 3 && src[0 .. 3] == "<<=") { const ParseOperator = "" ~ "<<="; } else static if(src[0 .. 2] == "<<") { const ParseOperator = "" ~ "<<"; } else static if(src[0 .. 2] == "<=") { const ParseOperator = "" ~ "<="; } else static if(src.length >= 3 && src[0 .. 3] == "<>=") { const ParseOperator = "" ~ "<>="; } else static if(src[0 .. 2] == "<>") { const ParseOperator = "" ~ "<>"; } else static if(src[0] == '<') { const ParseOperator = "" ~ '<'; } else static if(src.length >= 4 && src[0 .. 4] == ">>>=") { const ParseOperator = "" ~ ">>>="; } else static if(src.length >= 3 && src[0 .. 3] == ">>>") { const ParseOperator = "" ~ ">>>"; } else static if(src.length >= 3 && src[0 .. 3] == ">>=") { const ParseOperator = "" ~ ">>="; } else static if(src[0 .. 2] == ">=") { const ParseOperator = "" ~ ">="; } else static if(src[0] == '>') { const ParseOperator = "" ~ '>'; } else static if(src.length >= 4 && src[0 .. 4] == "!<>=") { const ParseOperator = "" ~ "!<>="; } else static if(src.length >= 3 && src[0 .. 3] == "!<>") { const ParseOperator = "" ~ "!<>"; } else static if(src.length >= 3 && src[0 .. 3] == "!<=") { const ParseOperator = "" ~ "!<="; } else static if(src[0 .. 2] == "!>=") { const ParseOperator = "" ~ "!>="; } else static if(src[0 .. 2] == "!>") { const ParseOperator = "" ~ "!>"; } else static if(src[0 .. 2] == "!<") { const ParseOperator = "" ~ "!<"; } else static if(src[0 .. 2] == "!=") { const ParseOperator = "" ~ "!="; } else static if(src[0] == '!') { const ParseOperator = "" ~ '!'; } else static if(src[0] == '(') { const ParseOperator = "" ~ '('; } else static if(src[0] == ')') { const ParseOperator = "" ~ ')'; } else static if(src[0] == ']') { const ParseOperator = "" ~ ']'; } else static if(src[0] == '[') { const ParseOperator = "" ~ '['; } else static if(src[0] == '{') { const ParseOperator = "" ~ '{'; } else static if(src[0] == '}') { const ParseOperator = "" ~ '}'; } else static if(src[0] == '?') { const ParseOperator = "" ~ '?'; } else static if(src[0] == ',') { const ParseOperator = "" ~ ','; } else static if(src[0] == ';') { const ParseOperator = "" ~ ';'; } else static if(src[0] == ':') { const ParseOperator = "" ~ ':'; } else static if(src[0] == '$') { const ParseOperator = "" ~ '$'; } else static if(src[0 .. 2] == "==") { const ParseOperator = "" ~ "=="; } else static if(src[0] == '=') { const ParseOperator = "" ~ '='; } else static if(src[0 .. 2] == "*=") { const ParseOperator = "" ~ "*="; } else static if(src[0] == '*') { const ParseOperator = "" ~ '*'; } else static if(src[0 .. 2] == "%=") { const ParseOperator = "" ~ "%="; } else static if(src[0] == '%') { const ParseOperator = "" ~ '%'; } else static if(src[0 .. 2] == "^=") { const ParseOperator = "" ~ "^="; } else static if(src[0] == '^') { const ParseOperator = "" ~ '^'; } else static if(src[0 .. 2] == "~=") { const ParseOperator = "" ~ "~="; } else static if(src[0] == '~') { const ParseOperator = "" ~ '~'; } else { const ParseOperator = ""; } } template ParseKeyword(const char[] src) { static if(src.length == 0) { const ParseKeyword = ""; } else static if(src.length >= 8 && src[0 .. 8] == "abstract") { const ParseKeyword = src[0 .. 8]; } else static if(src.length >= 5 && src[0 .. 5] == "alias") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "align") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 3 && src[0 .. 3] == "asm") { const ParseKeyword = src[0 .. 3]; } else static if(src.length >= 6 && src[0 .. 6] == "assert") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 4 && src[0 .. 4] == "auto") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 4 && src[0 .. 4] == "body") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 4 && src[0 .. 4] == "bool") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 5 && src[0 .. 5] == "break") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 4 && src[0 .. 4] == "byte") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 4 && src[0 .. 4] == "case") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 4 && src[0 .. 4] == "cast") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 5 && src[0 .. 5] == "catch") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 7 && src[0 .. 7] == "cdouble") { const ParseKeyword = src[0 .. 7]; } else static if(src.length >= 4 && src[0 .. 4] == "cent") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 6 && src[0 .. 6] == "cfloat") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 4 && src[0 .. 4] == "char") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 5 && src[0 .. 5] == "class") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "const") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 9 && src[0 .. 9] == "continue") { const ParseKeyword = src[0 .. 9]; } else static if(src.length >= 5 && src[0 .. 5] == "creal") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "dchar") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "debug") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 7 && src[0 .. 7] == "default") { const ParseKeyword = src[0 .. 7]; } else static if(src.length >= 8 && src[0 .. 8] == "delegate") { const ParseKeyword = src[0 .. 8]; } else static if(src.length >= 6 && src[0 .. 6] == "delete") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 10 && src[0 .. 10] == "deprecated") { const ParseKeyword = src[0 .. 10]; } else static if(src.length >= 2 && src[0 .. 2] == "do") { const ParseKeyword = src[0 .. 2]; } else static if(src.length >= 6 && src[0 .. 6] == "double") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 4 && src[0 .. 4] == "else") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 4 && src[0 .. 4] == "enum") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 6 && src[0 .. 6] == "export") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 6 && src[0 .. 6] == "extern") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 5 && src[0 .. 5] == "false") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "final") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 7 && src[0 .. 7] == "finally") { const ParseKeyword = src[0 .. 7]; } else static if(src.length >= 5 && src[0 .. 5] == "float") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 3 && src[0 .. 3] == "for") { const ParseKeyword = src[0 .. 3]; } else static if(src.length >= 7 && src[0 .. 7] == "foreach") { const ParseKeyword = src[0 .. 7]; } else static if(src.length >= 8 && src[0 .. 8] == "function") { const ParseKeyword = src[0 .. 8]; } else static if(src.length >= 15 && src[0 .. 15] == "foreach_reverse") { const ParseKeyword = src[0 .. 15]; } else static if(src.length >= 4 && src[0 .. 4] == "goto") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 7 && src[0 .. 7] == "idouble") { const ParseKeyword = src[0 .. 7]; } else static if(src.length >= 2 && src[0 .. 2] == "if") { const ParseKeyword = src[0 .. 2]; } else static if(src.length >= 6 && src[0 .. 6] == "ifloat") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 5 && src[0 .. 5] == "import") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 2 && src[0 .. 2] == "in") { const ParseKeyword = src[0 .. 2]; } else static if(src.length >= 5 && src[0 .. 5] == "inout") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 3 && src[0 .. 3] == "int") { const ParseKeyword = src[0 .. 3]; } else static if(src.length >= 9 && src[0 .. 9] == "interface") { const ParseKeyword = src[0 .. 9]; } else static if(src.length >= 9 && src[0 .. 9] == "invariant") { const ParseKeyword = src[0 .. 9]; } else static if(src.length >= 5 && src[0 .. 5] == "ireal") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 2 && src[0 .. 2] == "is") { const ParseKeyword = src[0 .. 2]; } else static if(src.length >= 4 && src[0 .. 4] == "lazy") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 4 && src[0 .. 4] == "long") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 5 && src[0 .. 5] == "macro") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "mixin") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 6 && src[0 .. 6] == "module") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 3 && src[0 .. 3] == "new") { const ParseKeyword = src[0 .. 3]; } else static if(src.length >= 4 && src[0 .. 4] == "null") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 3 && src[0 .. 3] == "out") { const ParseKeyword = src[0 .. 3]; } else static if(src.length >= 8 && src[0 .. 8] == "override") { const ParseKeyword = src[0 .. 8]; } else static if(src.length >= 7 && src[0 .. 7] == "package") { const ParseKeyword = src[0 .. 7]; } else static if(src.length >= 6 && src[0 .. 6] == "pragma") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 7 && src[0 .. 7] == "private") { const ParseKeyword = src[0 .. 7]; } else static if(src.length >= 9 && src[0 .. 9] == "protected") { const ParseKeyword = src[0 .. 9]; } else static if(src.length >= 6 && src[0 .. 6] == "public") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 4 && src[0 .. 4] == "real") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 3 && src[0 .. 3] == "ref") { const ParseKeyword = src[0 .. 3]; } else static if(src.length >= 6 && src[0 .. 6] == "return") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 5 && src[0 .. 5] == "scope") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "short") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 6 && src[0 .. 6] == "static") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 6 && src[0 .. 6] == "struct") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 5 && src[0 .. 5] == "super") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 6 && src[0 .. 6] == "switch") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 12 && src[0 .. 12] == "synchronized") { const ParseKeyword = src[0 .. 12]; } else static if(src.length >= 8 && src[0 .. 8] == "template") { const ParseKeyword = src[0 .. 8]; } else static if(src.length >= 4 && src[0 .. 4] == "this") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 5 && src[0 .. 5] == "throw") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 8 && src[0 .. 8] == "__traits") { const ParseKeyword = src[0 .. 8]; } else static if(src.length >= 4 && src[0 .. 4] == "true") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 3 && src[0 .. 3] == "try") { const ParseKeyword = src[0 .. 3]; } else static if(src.length >= 7 && src[0 .. 7] == "typedef") { const ParseKeyword = src[0 .. 7]; } else static if(src.length >= 6 && src[0 .. 6] == "typeid") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 6 && src[0 .. 6] == "typeof") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 5 && src[0 .. 5] == "ubyte") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "ucent") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 4 && src[0 .. 4] == "uint") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 5 && src[0 .. 5] == "ulong") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "union") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 8 && src[0 .. 8] == "unittest") { const ParseKeyword = src[0 .. 8]; } else static if(src.length >= 6 && src[0 .. 6] == "ushort") { const ParseKeyword = src[0 .. 6]; } else static if(src.length >= 7 && src[0 .. 7] == "version") { const ParseKeyword = src[0 .. 7]; } else static if(src.length >= 4 && src[0 .. 4] == "void") { const ParseKeyword = src[0 .. 4]; } else static if(src.length >= 8 && src[0 .. 8] == "volatile") { const ParseKeyword = src[0 .. 8]; } else static if(src.length >= 5 && src[0 .. 5] == "wchar") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 5 && src[0 .. 5] == "while") { const ParseKeyword = src[0 .. 5]; } else static if(src.length >= 4 && src[0 .. 4] == "with") { const ParseKeyword = src[0 .. 4]; } else { const ParseKeyword = ""; } }