Example #1
0
        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                Console.WriteLine("Please provide input file");
                Environment.Exit(-1);
            }

            string filePath      = $@"{Environment.CurrentDirectory}\{args[0]}";
            string fileName      = Path.GetFileNameWithoutExtension(filePath);
            string fileDirectory = Path.GetDirectoryName(filePath);
            string inputText     = File.ReadAllText(filePath);

            Lexer.Lexer lex = new Lexer.Lexer(inputText);

            List <Token> tokensToParse = new List <Token>();

            using (StreamWriter tokenFile = new StreamWriter($@"{fileDirectory}\{fileName}.outlextokens"))
                using (StreamWriter tokenErrorFile = new StreamWriter($@"{fileDirectory}\{fileName}.outlexerrors"))
                {
                    Token t;
                    do
                    {
                        t = lex.GetNextToken();
                        Console.WriteLine(t.ToString());

                        if (lex.IsErrorToken(t.TokenType))
                        {
                            tokenErrorFile.WriteLine(t.ToString());
                        }
                        else
                        {
                            tokenFile.WriteLine(t.ToString());
                            tokensToParse.Add(t);
                        }
                    }while (t.TokenType != TokenType.EOF);

                    tokensToParse.RemoveAll(x => lex.IsCommentToken(x.TokenType));
                }

            using (StreamWriter astStream = new StreamWriter($@"{fileDirectory}\{fileName}.outast"))
                using (StreamWriter derivationsStream = new StreamWriter($@"{fileDirectory}\{fileName}.outderivation"))
                    using (StreamWriter syntaxErrorStream = new StreamWriter($@"{fileDirectory}\{fileName}.outsyntaxerrors"))
                        using (StreamWriter symbolTablesStream = new StreamWriter($@"{fileDirectory}\{fileName}.outsymboltables"))
                            using (StreamWriter semanticErrorStream = new StreamWriter($@"{fileDirectory}\{fileName}.outsemanticerrors"))
                            {
                                // Do parsing
                                Parser.Parser parser = new Parser.Parser(tokensToParse, syntaxErrorStream, derivationsStream, astStream);
                                Console.WriteLine(parser.Parse());
                                var tree = parser.GetASTTree();
                                derivationsStream.Flush();
                                syntaxErrorStream.Flush();

                                var printVisitor = new DOTPrinterVisitor(astStream);
                                tree.Accept(printVisitor);
                                astStream.Flush();

                                var symbolTableVisitor = new SymbolTableVisitor(semanticErrorStream);
                                tree.Accept(symbolTableVisitor);

                                symbolTablesStream.WriteLine(symbolTableVisitor.GlobalSymbolTable);
                                Console.WriteLine(symbolTableVisitor.GlobalSymbolTable);

                                var semanticCheckerVisitor = new SemanticCheckerVisitor(semanticErrorStream, symbolTableVisitor.GlobalSymbolTable);
                                tree.Accept(semanticCheckerVisitor);
                            }
        }
Example #2
0
        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                Console.WriteLine("Please provide input file");
                Environment.Exit(-1);
            }

            string filePath      = $@"{Environment.CurrentDirectory}\{args[0]}";
            string fileName      = Path.GetFileNameWithoutExtension(filePath);
            string fileDirectory = Path.GetDirectoryName(filePath);
            string inputText     = File.ReadAllText(filePath);

            Lexer.Lexer lex = new Lexer.Lexer(inputText);

            List <Token> tokensToParse = new List <Token>();

            using (StreamWriter tokenFile = new StreamWriter($@"{fileDirectory}\{fileName}.outlextokens"))
                using (StreamWriter tokenErrorFile = new StreamWriter($@"{fileDirectory}\{fileName}.outlexerrors"))
                {
                    Token t;
                    do
                    {
                        t = lex.GetNextToken();
                        //Console.WriteLine(t.ToString());

                        if (lex.IsErrorToken(t.TokenType))
                        {
                            tokenErrorFile.WriteLine(t.ToString());
                            Console.WriteLine($"LexError: {t.ToString()}");
                        }
                        else
                        {
                            tokenFile.WriteLine(t.ToString());
                            tokensToParse.Add(t);
                        }
                    }while (t.TokenType != TokenType.EOF);

                    tokensToParse.RemoveAll(x => lex.IsCommentToken(x.TokenType));
                    Console.WriteLine("INFO: Lexing completed.");
                }

            using (StreamWriter astStream = new StreamWriter($@"{fileDirectory}\{fileName}.outast"))
                using (StreamWriter derivationsStream = new StreamWriter($@"{fileDirectory}\{fileName}.outderivation"))
                    using (StreamWriter syntaxErrorStream = new StreamWriter($@"{fileDirectory}\{fileName}.outsyntaxerrors"))
                        using (StreamWriter symbolTablesStream = new StreamWriter($@"{fileDirectory}\{fileName}.outsymboltables"))
                            using (StreamWriter semanticErrorStream = new StreamWriter($@"{fileDirectory}\{fileName}.outsemanticerrors"))
                                using (StreamWriter codeGenOutput = new StreamWriter($@"{fileDirectory}\{fileName}.moon"))
                                {
                                    // Do parsing
                                    Parser.Parser parser = new Parser.Parser(tokensToParse, syntaxErrorStream, derivationsStream, astStream);
                                    Console.WriteLine(parser.Parse() ? "Parsing passed" : "Error: Parsing Failed");
                                    var tree = parser.GetASTTree();

                                    var printVisitor = new DOTPrinterVisitor(astStream);
                                    tree.Accept(printVisitor);
                                    astStream.Flush();
                                    Console.WriteLine("INFO: AST Tree dumped to outast");

                                    var symbolTableVisitor = new SymbolTableVisitor(semanticErrorStream);
                                    tree.Accept(symbolTableVisitor);
                                    Console.WriteLine("INFO: SymbolTable Generated");

                                    var semanticCheckerVisitor = new SemanticCheckerVisitor(semanticErrorStream, symbolTableVisitor.GlobalSymbolTable);
                                    tree.Accept(semanticCheckerVisitor);
                                    Console.WriteLine("INFO: Semantic Checking Complete");

                                    syntaxErrorStream.Flush();
                                    semanticErrorStream.Flush();
                                    bool hasErrors = semanticErrorStream.BaseStream.Length != 0 || syntaxErrorStream.BaseStream.Length != 0;
                                    if (hasErrors)
                                    {
                                        Console.WriteLine("Errors generated during parsing/semantic checking, terminating...");
                                        Console.ReadKey();
                                        Environment.Exit(-10);
                                    }

                                    // Codegen
                                    codeGenOutput.NewLine = "\n";
                                    var codeWriter = new CodeWriter(codeGenOutput);
                                    var codeGen    = new CodeGen.CodeGen(tree, symbolTableVisitor.GlobalSymbolTable, codeWriter);
                                    codeGen.GenerateCode();

                                    symbolTablesStream.WriteLine(symbolTableVisitor.GlobalSymbolTable);
                                    Console.WriteLine("INFO: Code Generated");

                                    Console.ReadKey();
                                }
        }