public override object VisitCompileUnit([NotNull] CMinusParser.CompileUnitContext context)
 {
     this.Visit(context.program());
     if (!(this.symbolTable.HasSymbol("main") && this.symbolTable.GetSymbol("main").construct == SymbolTable.Symbol.Construct.FUNCTION))
     {
         this.EmitSemanticErrorMessage("No main function found", context);
     }
     return(null);
 }
예제 #2
0
        static int Main(string[] args)
        {
            Console.Write("Input path: ");
            string path = Console.ReadLine().Trim('\"');

            Console.Write("Output path: ");
            string outputPath = Console.ReadLine().Trim('\"');

            string input = File.ReadAllText(path);
            string code  = PrependCommonFunctions(input);

            Console.WriteLine(code);

            AntlrInputStream  inputStream = new AntlrInputStream(new StringReader(code));
            CMinusLexer       lexer       = new CMinusLexer(inputStream);
            CommonTokenStream tokens      = new CommonTokenStream(lexer);
            CMinusParser      parser      = new CMinusParser(tokens);

            SyntaxErrorListener syntaxErrorListener = new SyntaxErrorListener();

            parser.AddErrorListener(syntaxErrorListener);

            CMinusParser.CompileUnitContext tree = parser.compileUnit();

            if (lexer.errors > 0)
            {
                Console.WriteLine("Lexical analysis failure.");
            }

            if (syntaxErrorListener.errors > 0)
            {
                Console.WriteLine("Syntax analysis failure.");
            }

            if (lexer.errors > 0 || syntaxErrorListener.errors > 0)
            {
                Console.ReadKey();
                return(-1);
            }

            GlobalAnalysisVisitor globalVisitor = new GlobalAnalysisVisitor();

            globalVisitor.Visit(tree);

            if (globalVisitor.errors > 0)
            {
                Console.Error.WriteLine("Global semantic analysis failure.");
                Console.ReadKey();
                return(-1);
            }

            Console.WriteLine(globalVisitor.symbolTable.ToString());

            InternalAnalysisVisitor internalVisitor = new InternalAnalysisVisitor(globalVisitor.symbolTable);

            internalVisitor.Visit(tree);

            if (internalVisitor.errors > 0)
            {
                Console.Error.WriteLine("Internal semantic analysis failure.");
                Console.ReadKey();
                return(-1);
            }

            Console.WriteLine("\n----------\n");

            // ILVisitor ilVisitor = new ILVisitor(globalVisitor.symbolTable);
            // ilVisitor.Visit(tree);

            CrimsonForthVisitor CFVisitor = new CrimsonForthVisitor();

            CFVisitor.Visit(tree);

            string assemblyCode = CFVisitor.writer.Finalize();

            Console.WriteLine(assemblyCode);

            Console.WriteLine("\n----------\n");

            File.WriteAllText(outputPath, assemblyCode.Replace("\r", ""));

            Console.ReadKey();

            return(0);
        }