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 | //=====================================|======================================== |
---|