Exemple #1
0
        // System.IO.Path.GetTempFileName()

        private static void Main()
        {
            var args       = Environment.GetCommandLineArgs();
            var parameters = Parameters.parse(args);

            if (parameters == null)
            {
                printHelp(args);
                return;
            }
            if (parameters.outputFile == null)
            {
                parameters.outputFile = System.IO.Path.GetTempFileName();
            }

            var inputFile = new FileOrigin(args[1]);

            try
            {
                var parseTree = CSTBuilder.Build(inputFile);
                Console.WriteLine(parseTree.ToString());

                var backendFunctions = new Frontend().FromParseTreeToBackend(parseTree);

                var    backend      = new Backend.Backend();
                string assemblyFile = parameters.outputFile;
                if (!parameters.onlyAssembly)
                {
                    assemblyFile = System.IO.Path.GetTempFileName();
                }
                generateAssemblyFile(assemblyFile, backend.FromFunctionsToNasm(backendFunctions));
                if (!parameters.onlyAssembly)
                {
                    // TODO invoke NASM (using parameters)
                    var nasm = new Process();
                    nasm.StartInfo.FileName  = "nasm";  // take $PATH into account
                    nasm.StartInfo.Arguments = assemblyFile + " -o " + parameters.outputFile;
                    nasm.Start();
                    nasm.WaitForExit();
                }
            }
            catch (CSTBuilder.LexerFailure ex)
            {
                Console.WriteLine("Syntax error:");
                var diagnostics = new SourceDiagnostic();
                diagnostics.PrintFragmentInLine(ex.Fragment);
            }
        }
        public void PrintFragmentInLineTest()
        {
            string        source = "OK. Error in line 1\nLine 2.";
            IOriginReader reader = new StringOrigin(source).GetReader();

            for (int i = 0; i < 4; i++)
            {
                reader.MoveNext(); // 'OK. '
            }
            ILocation locBeg = reader.CurrentLocation;

            for (int i = 0; i < 5; i++)
            {
                reader.MoveNext(); // 'Error'
            }
            ILocation locEnd = reader.CurrentLocation;
            IFragment fr     = locBeg.Origin.MakeFragment(locBeg, locEnd);

            SourceDiagnostic sd = new SourceDiagnostic();

            sd.PrintFragmentInLine(fr);
        }