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); }
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); }