/++ + compile time lexer CTFE + + Authors: mikanya + Copyright: mikanya + License: NYSL Version 0.9982 +/ module meta.lexer_ctfe; string parseEndOfLine(string src) { if(src.length == 0) { return ""; } if(src.length >= 2 && src[0 .. 2] == "\r\n") { return src[0 .. 2]; } if(src[0] == 0x000D || src[0] == 0x000A) { return "" ~ src[0]; } return ""; } string parseSpace(string src) { if(src.length == 0) { return ""; } if(src[0] == 0x0020 || src[0] == 0x0009 || src[0] == 0x000B || src[0] == 0x000C) { return "" ~ src[0]; } return ""; } string parseWhiteSpace(string src) { if(src.length == 0) { return ""; } if(parseSpace(src) != "") { return parseSpace(src) ~ parseWhiteSpace(src[parseSpace(src).length .. $]); } return ""; } string parseLineComment(string src) { if(src.length == 0) { return ""; } if(src.length >= 2 && src[0 .. 2] == "//") { return src[0 .. 2] ~ parseLineCommentHelper(src[2 .. $]); } return ""; } string parseLineCommentHelper(string src) { if(src.length == 0) { return ""; } if(parseEndOfLine(src) != "") { return parseEndOfLine(src); } return src[0] ~ parseLineCommentHelper(src[1..$]); } string parseBlockComment(string src) { if(src.length == 0) { return ""; } if(src.length >= 2 && src[0 .. 2] == "/*") { return src[0 .. 2] ~ parseBlockCommentHelper(src[2 .. $]); } return ""; } string parseBlockCommentHelper(string src) { if(src.length == 0) { return ""; } if(src.length >= 2 && src[0 .. 2] == "*/") { return src[0 .. 2]; } return src[0] ~ parseBlockCommentHelper(src[1 .. $]); } string parseNestingBlockComment(string src) { if(src.length == 0) { return ""; } if(src.length >= 2 && src[0 .. 2] == "/+") { return src[0 .. 2] ~ parseNestingBlockCommentHelper(src[2 .. $]); } return ""; } string parseNestingBlockCommentHelper(string src) { if(src.length == 0) { return ""; } if(src[0 .. 2] == "+/") { return src[0 .. 2]; } if(src[0 .. 2] == "/+") { return parseNestingBlockComment(src) ~ parseNestingBlockCommentHelper(src[parseNestingBlockComment(src).length .. $]); } return src[0] ~ parseNestingBlockCommentHelper(src[1 .. $]); } string parseComment(string src) { if(src.length == 0) { return ""; } if(parseBlockComment(src) != "") { return parseBlockComment(src); } if(parseLineComment(src) != "") { return parseLineComment(src); } if(parseNestingBlockComment(src) != "") { return parseNestingBlockComment(src); } return ""; } string parseIdentifier(string src) { if(src.length == 0) { return ""; } if(src[0] == '_' || (src[0] >= 'a' && src[0] <= 'z') || (src[0] >= 'A' && src[0] <= 'Z')) { return src[0] ~ parseIdentifierHelper(src[1 .. $]); } return ""; } string parseIdentifierHelper(string src) { if(src.length == 0) { return ""; } if(src[0] == '_' || (src[0] >= 'a' && src[0] <= 'z') || (src[0] >= 'A' && src[0] <= 'Z') || src[0] == '0' || (src[0] >= '1' && src[0] <= '9')) { return src[0] ~ parseIdentifierHelper(src[1 .. $]); } return ""; } string parseStringLiteral(string src) { if(src.length == 0) { return ""; } if(parseWysiwygString(src) != "") { return parseWysiwygString(src); } if(parseAlternateWysiwygString(src) != "") { return parseAlternateWysiwygString(src); } if(parseDoubleQuotedString(src) != "") { return parseDoubleQuotedString(src); } return ""; } string parsePostfix(string src) { if(src.length == 0) { return ""; } return ""; } string parseWysiwygString(string src) { if(src.length == 0) { return ""; } if(src.length >= 2 && src[0 .. 2] == "r\"") { return src[0] ~ parseWysiwygStringHelper(src[1 .. $]); } return ""; } string parseWysiwygStringHelper(string src) { if(src.length == 0) { return ""; } if(src[0] == '\"') { return "" ~ src[0]; } return src[0] ~ parseWysiwygStringHelper(src[1 .. $]); } string parseAlternateWysiwygString(string src) { if(src.length == 0) { return ""; } if(src[0] == '`') { return src[0] ~ parseAlternateWysiwygStringHelper(src[1 .. $]); } return ""; } string parseAlternateWysiwygStringHelper(string src) { if(src.length == 0) { return ""; } if(src[0] == '`') { return "" ~ src[0]; } return src[0] ~ parseAlternateWysiwygStringHelper(src[1 .. $]); } string parseDoubleQuotedString(string src) { if(src.length == 0) { return ""; } if(src[0] == '\"') { return src[0] ~ parseDoubleQuotedStringHelper(src[1 .. $]); } return ""; } string parseDoubleQuotedStringHelper(string src) { if(src.length == 0) { return ""; } if(src[0] == '\"') { return "" ~ src[0]; } return src[0] ~ parseDoubleQuotedStringHelper(src[1 .. $]); } string parseIntegerLiteral(string src) { if(src.length == 0) { return ""; } if(parseDecimal(src) != "") { return parseDecimal(src); } return ""; } string parseDecimal(string src) { if(src.length == 0) { return ""; } if(src[0] == '0' || (src[0] >= '1' && src[0] <= '9')) { return src[0] ~ parseDecimal(src[1 .. $]); } return ""; } string parseOperator(string src) { if(src.length == 0) { return ""; } if(src[0 .. 2] == "/=") { return "" ~ "/="; } if(src[0] == '/') { return "" ~ '/'; } if(src.length >= 3 && src[0 .. 3] == "...") { return "" ~ "..."; } if(src[0 .. 2] == "..") { return "" ~ ".."; } if(src[0] == '.') { return "" ~ '.'; } if(src[0 .. 2] == "&=") { return "" ~ "&="; } if(src[0 .. 2] == "&&") { return "" ~ "&&"; } if(src[0] == '&') { return "" ~ '&'; } if(src[0 .. 2] == "|=") { return "" ~ "|="; } if(src[0 .. 2] == "||") { return "" ~ "||"; } if(src[0] == '|') { return "" ~ '|'; } if(src[0 .. 2] == "-=") { return "" ~ "-="; } if(src[0 .. 2] == "--") { return "" ~ "--"; } if(src[0] == '-') { return "" ~ '-'; } if(src[0 .. 2] == "+=") { return "" ~ "+="; } if(src[0 .. 2] == "++") { return "" ~ "++"; } if(src[0] == '+') { return "" ~ '+'; } if(src.length >= 3 && src[0 .. 3] == "<<=") { return "" ~ "<<="; } if(src[0 .. 2] == "<<") { return "" ~ "<<"; } if(src[0 .. 2] == "<=") { return "" ~ "<="; } if(src.length >= 3 && src[0 .. 3] == "<>=") { return "" ~ "<>="; } if(src[0 .. 2] == "<>") { return "" ~ "<>"; } if(src[0] == '<') { return "" ~ '<'; } if(src.length >= 4 && src[0 .. 4] == ">>>=") { return "" ~ ">>>="; } if(src.length >= 3 && src[0 .. 3] == ">>>") { return "" ~ ">>>"; } if(src.length >= 3 && src[0 .. 3] == ">>=") { return "" ~ ">>="; } if(src[0 .. 2] == ">=") { return "" ~ ">="; } if(src[0] == '>') { return "" ~ '>'; } if(src.length >= 4 && src[0 .. 4] == "!<>=") { return "" ~ "!<>="; } if(src.length >= 3 && src[0 .. 3] == "!<>") { return "" ~ "!<>"; } if(src.length >= 3 && src[0 .. 3] == "!<=") { return "" ~ "!<="; } if(src[0 .. 2] == "!>=") { return "" ~ "!>="; } if(src[0 .. 2] == "!>") { return "" ~ "!>"; } if(src[0 .. 2] == "!<") { return "" ~ "!<"; } if(src[0 .. 2] == "!=") { return "" ~ "!="; } if(src[0] == '!') { return "" ~ '!'; } if(src[0] == '(') { return "" ~ '('; } if(src[0] == ')') { return "" ~ ')'; } if(src[0] == ']') { return "" ~ ']'; } if(src[0] == '[') { return "" ~ '['; } if(src[0] == '{') { return "" ~ '{'; } if(src[0] == '}') { return "" ~ '}'; } if(src[0] == '?') { return "" ~ '?'; } if(src[0] == ',') { return "" ~ ','; } if(src[0] == ';') { return "" ~ ';'; } if(src[0] == ':') { return "" ~ ':'; } if(src[0] == '$') { return "" ~ '$'; } if(src[0 .. 2] == "==") { return "" ~ "=="; } if(src[0] == '=') { return "" ~ '='; } if(src[0 .. 2] == "*=") { return "" ~ "*="; } if(src[0] == '*') { return "" ~ '*'; } if(src[0 .. 2] == "%=") { return "" ~ "%="; } if(src[0] == '%') { return "" ~ '%'; } if(src[0 .. 2] == "^=") { return "" ~ "^="; } if(src[0] == '^') { return "" ~ '^'; } if(src[0 .. 2] == "~=") { return "" ~ "~="; } if(src[0] == '~') { return "" ~ '~'; } else { return ""; } } string parseToken(string src) { if(src.length == 0) { return ""; } if(parseWhiteSpace(src) != "") { return ""; } if(parseComment(src) != "") { return ""; } if(parseEndOfLine(src) != "") { return ""; } if(parseIdentifier(src) != "") { return parseIdentifier(src); } if(parseStringLiteral(src) != "") { return parseStringLiteral(src); } if(parseIntegerLiteral(src) != "") { return parseIntegerLiteral(src); } if(parseOperator(src) != "") { return parseOperator(src); } return ""; } string lexer(string src) { if(src.length == 0) { return ""; } if(parseWhiteSpace(src) != "") { //return "\n" ~ lexer(src[parseWhiteSpace(src).length .. $]); return lexer(src[parseWhiteSpace(src).length .. $]); } if(parseComment(src) != "") { //return "\n" ~ lexer(src[parseComment(src).length .. $]); return lexer(src[parseComment(src).length .. $]); } if(parseEndOfLine(src) != "") { //return "\n" ~ lexer(src[parseEndOfLine(src).length .. $]); return lexer(src[parseEndOfLine(src).length .. $]); } if(parseToken(src) != "") { return parseToken(src) ~ " " ~ lexer(src[parseToken(src).length .. $]); //return "\n" ~ lexer(src[parseToken(src).length .. $]); //return lexer(src[parseToken(src).length .. $]); } return ""; }