static void Main(string[] args) { Lexer lex = new Lexer(); lex.AddSingleChar(LT.NONE, LT.COMMENT_1, '/', false, false); lex.AddSingleChar(LT.COMMENT_1, LT.COMMENT_ML_1, '*', false, false); lex.AddSingleChar(LT.COMMENT_ML_1, LT.COMMENT_ML_END_1, '*', false, false); lex.FillRemaining(LT.COMMENT_ML_1, LT.COMMENT_ML_1, false, true); lex.AddSingleChar(LT.COMMENT_ML_END_1, LT.COMMENT_ML, '/', true, false); lex.AddSingleChar(LT.COMMENT_ML_END_1, LT.COMMENT_ML_END_1, '*', false, true); lex.FillRemaining(LT.COMMENT_ML_END_1, LT.COMMENT_ML_1, false, true, "*"); lex.AddSingleChar(LT.COMMENT_1, LT.COMMENT_SL_1, '/', false, false); lex.AddSingleChar(LT.COMMENT_SL_1, LT.COMMENT_SL, '\n', true, false); lex.AddSingleChar(LT.COMMENT_SL_1, LT.COMMENT_SL, '\r', true, false); lex.FillRemaining(LT.COMMENT_SL_1, LT.COMMENT_SL_1, false, true); char[] letter = new[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '_' }; char[] digit = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; lex.AddSingleChar(LT.NONE, LT.STR_1, '"', false, false); lex.AddSingleChar(LT.STR_1, LT.STRING_ESCAPE, '\\', false, false); lex.AddSingleChar(LT.STRING_ESCAPE, LT.STR_1, 'n', false, true, "\n"); lex.AddSingleChar(LT.STRING_ESCAPE, LT.STR_1, 'r', false, true, "\r"); lex.AddSingleChar(LT.STRING_ESCAPE, LT.STR_1, 't', false, true, "\t"); lex.AddSingleChar(LT.STRING_ESCAPE, LT.STR_1, '\\', false, true); lex.AddSingleChar(LT.STRING_ESCAPE, LT.STR_1, '"', false, true); lex.AddByRange(LT.STR_1, LT.STR_1, ' ', '!', false, true); lex.AddByRange(LT.STR_1, LT.STR_1, '#', '[', false, true); lex.AddByRange(LT.STR_1, LT.STR_1, ']', '~', false, true); lex.AddSingleChar(LT.STR_1, LT.LIT_STR, '"', true, false); lex.FillRemaining(LT.STR_1, LT.NONE, false, true, "Invalid character in string"); lex.AddArray(LT.NONE, LT.IDENT, letter, true, true); lex.AddArray(LT.IDENT, LT.IDENT, letter, true, true); lex.AddArray(LT.IDENT, LT.IDENT, digit, true, true); lex.AddSingleChar(LT.NONE, LT.CH_1, '\'', false, false); lex.AddSingleChar(LT.CH_1, LT.CH_ESC, '\\', false, false); lex.AddSingleChar(LT.CH_1, LT.NONE, '\'', false, false); lex.AddByRange(LT.CH_1, LT.CH_2, ' ', '&', false, true); lex.AddByRange(LT.CH_1, LT.CH_2, '(', '[', false, true); lex.AddByRange(LT.CH_1, LT.CH_2, ']', '~', false, true); lex.AddSingleChar(LT.CH_ESC, LT.CH_2, 'n', false, true, "\n"); lex.AddSingleChar(LT.CH_ESC, LT.CH_2, 'r', false, true, "\r"); lex.AddSingleChar(LT.CH_ESC, LT.CH_2, 't', false, true, "\t"); lex.AddSingleChar(LT.CH_ESC, LT.CH_2, '\\', false, true); lex.AddSingleChar(LT.CH_ESC, LT.CH_2, '\'', false, true); lex.AddSingleChar(LT.CH_2, LT.LIT_CHAR, '\'', true, false); lex.AddArray(LT.NONE, LT.LIT_INT, digit, true, true); lex.AddArray(LT.LIT_INT, LT.LIT_INT, digit, true, true); lex.AddSingleChar(LT.LIT_INT, LT.LIT_FLOAT, '.', true, true); lex.AddSingleChar(LT.NONE, LT.LIT_FLOAT_1, '.', false, true); lex.AddArray(LT.LIT_FLOAT_1, LT.LIT_FLOAT, digit, true, true); lex.AddArray(LT.LIT_FLOAT, LT.LIT_FLOAT, digit, true, true); string numErr = "Non-numeric character found in numeric token"; lex.AddArray(LT.LIT_INT, LT.NONE, letter, false, true, numErr); lex.AddArray(LT.LIT_FLOAT, LT.NONE, letter, false, true, numErr); lex.AddString("struct", LT.KW_STRUCT); lex.AddString("return", LT.KW_RETURN); lex.AddString("break", LT.KW_BREAK); lex.AddString("continue", LT.KW_CONT); lex.AddString("if", LT.KW_IF); lex.AddString("else", LT.KW_ELSE); lex.AddString("true", LT.KW_TRUE); lex.AddString("false", LT.KW_FALSE); lex.AddString("while", LT.KW_WHILE); lex.AddString("for", LT.KW_FOR); lex.AddString("+", LT.OP_ADD); lex.AddString("-", LT.OP_SUB); lex.AddString("*", LT.OP_MUL); lex.AddString("/", LT.OP_DIV); lex.AddString("%", LT.OP_MOD); lex.AddString("!", LT.OP_NEG); lex.AddString(">", LT.OP_G); lex.AddString("<", LT.OP_L); lex.AddString(">=", LT.OP_GE); lex.AddString("<=", LT.OP_LE); lex.AddString("==", LT.OP_EQ); lex.AddString("!=", LT.OP_NE); lex.AddString("&", LT.OP_BAND); lex.AddString("|", LT.OP_BOR); lex.AddString("<<", LT.OP_BSHL); lex.AddString(">>", LT.OP_BSHR); lex.AddString("^", LT.OP_BXOR); lex.AddString("~", LT.OP_BNOT); lex.AddString("[", LT.OP_SQBRACKET_O); lex.AddString("]", LT.OP_SQBRACKET_C); lex.AddString("{", LT.OP_BRACE_O); lex.AddString("}", LT.OP_BRACE_C); lex.AddString("(", LT.OP_PAREN_O); lex.AddString(")", LT.OP_PAREN_C); lex.AddString(";", LT.OP_SC); lex.AddString(",", LT.OP_COMMA); lex.AddString("&&", LT.OP_AND); lex.AddString("||", LT.OP_OR); lex.AddString(".", LT.OP_PNT); lex.AddString("=", LT.OP_ASSIGN); lex.AddString(":", LT.OP_COLON); //lex.FillRemaining(LT.NONE, LT.NONE, false, false); var lexemes = lex.Analyze(string.Join(" ", args)); //if(lexemes != null) //{ // Console.WriteLine(" ID | Line | Type | Value"); // Console.WriteLine("-------+-------+---------------------------+------------------"); // for (int i = 0; i < lexemes.Length; i++) // { // var l = lexemes[i]; // Console.WriteLine($" {i,5} | {l.Line,5} | {l.Type,-25} | {l.Value}"); // } //} File.WriteAllText("graph.dot", lex.GenerateDot()); var parser = new cmm.parser.Parser(lexemes); parser.Parse(); //Console.WriteLine( // JsonConvert.SerializeObject( // parser.Parse(), // Formatting.Indented, // new JsonSerializerSettings // { // TypeNameHandling = TypeNameHandling.All, // SerializationBinder = new SimpleNameBinder(), // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, // PreserveReferencesHandling = PreserveReferencesHandling.Objects // } // ) //); }