Exemple #1
0
        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
            //        }
            //    )
            //);
        }