[9528] | 1 | // ATTENTION: Replace all occurences of GpdlCompiler by the compiler name!
|
---|
| 2 |
|
---|
| 3 | // GpdlCompiler.cs HDO, 2006-08-28
|
---|
| 4 | // -----
|
---|
| 5 | // Main program for compiler generated from GpdlCompiler.atg with Coco-2.
|
---|
| 6 | //=====================================|========================================
|
---|
| 7 |
|
---|
| 8 | using System;
|
---|
| 9 | using System.IO;
|
---|
| 10 |
|
---|
| 11 | using Lex = GPDefLex;
|
---|
| 12 | using Syn = GPDefSyn;
|
---|
| 13 |
|
---|
| 14 | public class GpdlCompiler {
|
---|
| 15 |
|
---|
| 16 | private static String NAME = "GpdlCompiler";
|
---|
| 17 | private static bool interactiveMode;
|
---|
| 18 |
|
---|
| 19 | private static void Abort(String abortKind, String moduleName,
|
---|
| 20 | String methName, String descr) {
|
---|
| 21 | Console.WriteLine();
|
---|
| 22 | Console.WriteLine("*** {0} in class {1} method {2}",
|
---|
| 23 | abortKind, moduleName, methName);
|
---|
| 24 | Console.WriteLine("*** {0}", descr);
|
---|
| 25 | Console.WriteLine();
|
---|
| 26 | Console.WriteLine();
|
---|
| 27 | Console.WriteLine(NAME + " aborted");
|
---|
| 28 | Utils.Modules(Utils.ModuleAction.cleanupModule);
|
---|
| 29 | if (interactiveMode) {
|
---|
| 30 | Console.Write("type [CR] to quit");
|
---|
| 31 | string dummy = Console.ReadLine();
|
---|
| 32 | } // if
|
---|
| 33 | Environment.Exit(Utils.EXIT_FAILURE);
|
---|
| 34 | } // Abort
|
---|
| 35 |
|
---|
| 36 | private static int CompileFile(String srcFileName) {
|
---|
| 37 | FileStream srcFs = null;
|
---|
| 38 | try {
|
---|
| 39 | srcFs = new FileStream(srcFileName, FileMode.Open);
|
---|
| 40 | }
|
---|
| 41 | catch (Exception) {
|
---|
| 42 | Console.WriteLine("*** file \"{0}\" not found", srcFileName);
|
---|
| 43 | return Utils.EXIT_FAILURE;
|
---|
| 44 | } // try/catch
|
---|
| 45 | try {
|
---|
| 46 | Lex.src = new StreamReader(srcFs);
|
---|
| 47 | Console.WriteLine("parsing ...");
|
---|
| 48 | Syn.Parse();
|
---|
| 49 | Lex.src.Close();
|
---|
| 50 | Lex.src.Dispose();
|
---|
| 51 | Lex.src = null;
|
---|
| 52 | if (Errors.NumOfErrors() > 0) {
|
---|
| 53 | Console.WriteLine("listing ...");
|
---|
| 54 | String lstFileName = Path.ChangeExtension(srcFileName, ".lst");
|
---|
| 55 | FileStream lstFs = null;
|
---|
| 56 | try {
|
---|
| 57 | lstFs = new FileStream(lstFileName, FileMode.Create);
|
---|
| 58 | }
|
---|
| 59 | catch (Exception) {
|
---|
| 60 | Utils.FatalError(NAME, "CompileFile", "file \"{0}\" not created", lstFileName);
|
---|
| 61 | return Utils.EXIT_FAILURE;
|
---|
| 62 | } // try/catch
|
---|
| 63 | StreamWriter lstWriter = null;
|
---|
| 64 | try {
|
---|
| 65 | lstWriter = new StreamWriter(lstFs);
|
---|
| 66 | StreamReader srcFsReader = null;
|
---|
| 67 | try { // open the source file a second time to generate the error listing
|
---|
| 68 | srcFsReader = new StreamReader(new FileStream(srcFileName, FileMode.Open));
|
---|
| 69 | lstWriter.WriteLine(NAME + " (file: \"{0}\")", srcFileName);
|
---|
| 70 | Errors.GenerateListing(srcFsReader, lstWriter, Errors.ListingShape.longListing);
|
---|
| 71 | }
|
---|
| 72 | finally {
|
---|
| 73 | srcFsReader.Close();
|
---|
| 74 | srcFsReader.Dispose();
|
---|
| 75 | } // try/finally
|
---|
| 76 | Console.WriteLine("{0} error(s) detected", Errors.NumOfErrors());
|
---|
| 77 | }
|
---|
| 78 | finally {
|
---|
| 79 | lstWriter.Close();
|
---|
| 80 | lstWriter.Dispose();
|
---|
| 81 | } // try/finally
|
---|
| 82 | } else
|
---|
| 83 | Console.WriteLine("no errors detected");
|
---|
| 84 | }
|
---|
| 85 | finally {
|
---|
| 86 | if (Lex.src != null) {
|
---|
| 87 | Lex.src.Close();
|
---|
| 88 | Lex.src.Dispose();
|
---|
| 89 | Lex.src = null;
|
---|
| 90 | } // if
|
---|
| 91 | Utils.Modules(Utils.ModuleAction.resetModule);
|
---|
| 92 | } // try/finally to make sure srcFs and srcReader are closed
|
---|
| 93 | return Utils.EXIT_SUCCESS;
|
---|
| 94 | } // CompileFile
|
---|
| 95 |
|
---|
| 96 |
|
---|
| 97 | public static void Main(String[] args) {
|
---|
| 98 | //-----------------------------------|----------------------------------------
|
---|
| 99 | int result = 0;
|
---|
| 100 |
|
---|
| 101 | // --- install modules ---
|
---|
| 102 | Utils.InstallModule("Utils", new Utils.ModuleMethodDelegate(Utils.UtilsMethod));
|
---|
| 103 | Utils.InstallModule("Sets", new Utils.ModuleMethodDelegate(Sets.SetsMethod));
|
---|
| 104 | Utils.InstallModule("Errors", new Utils.ModuleMethodDelegate(Errors.ErrorsMethod));
|
---|
| 105 |
|
---|
| 106 | Utils.InstallModule("GPDefLex", new Utils.ModuleMethodDelegate(GPDefLex.GPDefLexMethod));
|
---|
| 107 | Utils.InstallModule("GPDefSem", new Utils.ModuleMethodDelegate(GPDefSem.GPDefSemMethod));
|
---|
| 108 | Utils.InstallModule("GPDefSyn", new Utils.ModuleMethodDelegate(GPDefSyn.GPDefSynMethod));
|
---|
| 109 |
|
---|
| 110 | // --- initialize modules ---
|
---|
| 111 | Utils.Modules(Utils.ModuleAction.initModule);
|
---|
| 112 |
|
---|
| 113 | Errors.PushAbortMethod(new Errors.AbortMethod(Abort));
|
---|
| 114 |
|
---|
| 115 | Console.WriteLine("---------------------------");
|
---|
| 116 | Console.WriteLine(" {0} Compiler {1," + (5 - NAME.Length) + "} Version X ", NAME, "");
|
---|
| 117 | Console.WriteLine(" Frontend gen. with Coco-2");
|
---|
| 118 | Console.WriteLine("---------------------------");
|
---|
| 119 | Console.WriteLine();
|
---|
| 120 |
|
---|
| 121 | if (args.Length > 0) { // command line mode
|
---|
| 122 | interactiveMode = false;
|
---|
| 123 | Console.WriteLine();
|
---|
| 124 | int i = 0;
|
---|
| 125 | do {
|
---|
| 126 | Console.WriteLine("source file \"{0}\"", args[i]);
|
---|
| 127 | result = CompileFile(args[i]);
|
---|
| 128 | if (result != Utils.EXIT_SUCCESS)
|
---|
| 129 | Environment.Exit(result);
|
---|
| 130 | Console.WriteLine();
|
---|
| 131 | i++;
|
---|
| 132 | } while (i < args.Length);
|
---|
| 133 | } else { // args.Length == 0, interactive mode
|
---|
| 134 | interactiveMode = true;
|
---|
| 135 | for (; ; ) {
|
---|
| 136 | String srcFileName;
|
---|
| 137 | Utils.GetInputFileName("source file > ", out srcFileName);
|
---|
| 138 | if (srcFileName.Length > 0) {
|
---|
| 139 | result = CompileFile(srcFileName);
|
---|
| 140 | if (result != Utils.EXIT_SUCCESS)
|
---|
| 141 | Environment.Exit(result);
|
---|
| 142 | } // if
|
---|
| 143 | char answerCh;
|
---|
| 144 | do {
|
---|
| 145 | Console.WriteLine();
|
---|
| 146 | Console.Write("[c]ontinue or [q]uit > ");
|
---|
| 147 | answerCh = Char.ToUpper(Console.ReadKey().KeyChar);
|
---|
| 148 | } while (answerCh != 'C' && answerCh != 'Q');
|
---|
| 149 | if (answerCh == 'Q')
|
---|
| 150 | break;
|
---|
| 151 | else // answerCh == 'C'
|
---|
| 152 | Console.WriteLine();
|
---|
| 153 | } // for
|
---|
| 154 | } // else
|
---|
| 155 |
|
---|
| 156 | Utils.Modules(Utils.ModuleAction.cleanupModule);
|
---|
| 157 | Environment.Exit(Utils.EXIT_SUCCESS);
|
---|
| 158 |
|
---|
| 159 | } // Main
|
---|
| 160 |
|
---|
| 161 | } // GpdlCompiler
|
---|
| 162 |
|
---|
| 163 | // End of GpdlCompiler.cs
|
---|
| 164 | //=====================================|======================================== |
---|