Rev 9177 | Rev 9847 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7983 | leency | 1 | (* |
7597 | akron1 | 2 | BSD 2-Clause License |
6613 | leency | 3 | |
8859 | leency | 4 | Copyright (c) 2018-2021, Anton Krotov |
7597 | akron1 | 5 | All rights reserved. |
6613 | leency | 6 | *) |
7 | |||
8 | MODULE Compiler; |
||
9 | |||
7983 | leency | 10 | IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE, |
9177 | akron1 | 11 | ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS, SCAN, TEXTDRV; |
6613 | leency | 12 | |
13 | |||
8859 | leency | 14 | CONST |
15 | |||
16 | DEF_WINDOWS = "WINDOWS"; |
||
17 | DEF_LINUX = "LINUX"; |
||
18 | DEF_KOLIBRIOS = "KOLIBRIOS"; |
||
19 | DEF_CPU_X86 = "CPU_X86"; |
||
20 | DEF_CPU_X8664 = "CPU_X8664"; |
||
21 | |||
22 | |||
7696 | akron1 | 23 | PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH); |
6613 | leency | 24 | VAR |
7597 | akron1 | 25 | param: PARS.PATH; |
26 | i, j: INTEGER; |
||
8097 | maxcodehac | 27 | _end: BOOLEAN; |
7597 | akron1 | 28 | value: INTEGER; |
29 | minor, |
||
30 | major: INTEGER; |
||
7693 | akron1 | 31 | checking: SET; |
6613 | leency | 32 | |
9177 | akron1 | 33 | |
34 | PROCEDURE getVal (VAR i: INTEGER; VAR value: INTEGER); |
||
35 | VAR |
||
36 | param: PARS.PATH; |
||
37 | val: INTEGER; |
||
38 | BEGIN |
||
39 | INC(i); |
||
40 | UTILS.GetArg(i, param); |
||
41 | IF STRINGS.StrToInt(param, val) THEN |
||
42 | value := val |
||
43 | END; |
||
44 | IF param[0] = "-" THEN |
||
45 | DEC(i) |
||
46 | END |
||
47 | END getVal; |
||
48 | |||
49 | |||
6613 | leency | 50 | BEGIN |
7696 | akron1 | 51 | out := ""; |
7693 | akron1 | 52 | checking := options.checking; |
8097 | maxcodehac | 53 | _end := FALSE; |
7696 | akron1 | 54 | i := 3; |
7597 | akron1 | 55 | REPEAT |
56 | UTILS.GetArg(i, param); |
||
6613 | leency | 57 | |
7597 | akron1 | 58 | IF param = "-stk" THEN |
59 | INC(i); |
||
60 | UTILS.GetArg(i, param); |
||
61 | IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN |
||
7693 | akron1 | 62 | options.stack := value |
7597 | akron1 | 63 | END; |
64 | IF param[0] = "-" THEN |
||
65 | DEC(i) |
||
66 | END |
||
6613 | leency | 67 | |
7696 | akron1 | 68 | ELSIF param = "-out" THEN |
7597 | akron1 | 69 | INC(i); |
70 | UTILS.GetArg(i, param); |
||
71 | IF param[0] = "-" THEN |
||
72 | DEC(i) |
||
7696 | akron1 | 73 | ELSE |
74 | out := param |
||
7597 | akron1 | 75 | END |
6613 | leency | 76 | |
9177 | akron1 | 77 | ELSIF param = "-tab" THEN |
78 | getVal(i, options.tab) |
||
79 | |||
7693 | akron1 | 80 | ELSIF param = "-ram" THEN |
9177 | akron1 | 81 | getVal(i, options.ram) |
7693 | akron1 | 82 | |
83 | ELSIF param = "-rom" THEN |
||
9177 | akron1 | 84 | getVal(i, options.rom) |
7693 | akron1 | 85 | |
7597 | akron1 | 86 | ELSIF param = "-nochk" THEN |
87 | INC(i); |
||
88 | UTILS.GetArg(i, param); |
||
6613 | leency | 89 | |
7597 | akron1 | 90 | IF param[0] = "-" THEN |
91 | DEC(i) |
||
92 | ELSE |
||
93 | j := 0; |
||
94 | WHILE param[j] # 0X DO |
||
6613 | leency | 95 | |
7597 | akron1 | 96 | IF param[j] = "p" THEN |
97 | EXCL(checking, ST.chkPTR) |
||
98 | ELSIF param[j] = "t" THEN |
||
99 | EXCL(checking, ST.chkGUARD) |
||
100 | ELSIF param[j] = "i" THEN |
||
101 | EXCL(checking, ST.chkIDX) |
||
102 | ELSIF param[j] = "b" THEN |
||
103 | EXCL(checking, ST.chkBYTE) |
||
104 | ELSIF param[j] = "c" THEN |
||
105 | EXCL(checking, ST.chkCHR) |
||
106 | ELSIF param[j] = "w" THEN |
||
107 | EXCL(checking, ST.chkWCHR) |
||
108 | ELSIF param[j] = "r" THEN |
||
109 | EXCL(checking, ST.chkCHR); |
||
110 | EXCL(checking, ST.chkWCHR); |
||
111 | EXCL(checking, ST.chkBYTE) |
||
8859 | leency | 112 | ELSIF param[j] = "s" THEN |
113 | EXCL(checking, ST.chkSTK) |
||
7597 | akron1 | 114 | ELSIF param[j] = "a" THEN |
115 | checking := {} |
||
116 | END; |
||
6613 | leency | 117 | |
7597 | akron1 | 118 | INC(j) |
7693 | akron1 | 119 | END; |
120 | |||
7597 | akron1 | 121 | END |
6613 | leency | 122 | |
7597 | akron1 | 123 | ELSIF param = "-ver" THEN |
124 | INC(i); |
||
125 | UTILS.GetArg(i, param); |
||
126 | IF STRINGS.StrToVer(param, major, minor) THEN |
||
7693 | akron1 | 127 | options.version := major * 65536 + minor |
7597 | akron1 | 128 | END; |
129 | IF param[0] = "-" THEN |
||
130 | DEC(i) |
||
131 | END |
||
6613 | leency | 132 | |
8097 | maxcodehac | 133 | ELSIF param = "-lower" THEN |
134 | options.lower := TRUE |
||
135 | |||
7597 | akron1 | 136 | ELSIF param = "-pic" THEN |
7693 | akron1 | 137 | options.pic := TRUE |
6613 | leency | 138 | |
9579 | akron1 | 139 | ELSIF param = "-uses" THEN |
140 | options.uses := TRUE |
||
141 | |||
8097 | maxcodehac | 142 | ELSIF param = "-def" THEN |
143 | INC(i); |
||
144 | UTILS.GetArg(i, param); |
||
145 | SCAN.NewDef(param) |
||
146 | |||
7597 | akron1 | 147 | ELSIF param = "" THEN |
8097 | maxcodehac | 148 | _end := TRUE |
6613 | leency | 149 | |
7107 | akron1 | 150 | ELSE |
7693 | akron1 | 151 | ERRORS.BadParam(param) |
7107 | akron1 | 152 | END; |
6613 | leency | 153 | |
7597 | akron1 | 154 | INC(i) |
8097 | maxcodehac | 155 | UNTIL _end; |
6613 | leency | 156 | |
7693 | akron1 | 157 | options.checking := checking |
7597 | akron1 | 158 | END keys; |
6613 | leency | 159 | |
160 | |||
7983 | leency | 161 | PROCEDURE OutTargetItem (target: INTEGER; text: ARRAY OF CHAR); |
162 | VAR |
||
163 | width: INTEGER; |
||
164 | |||
165 | BEGIN |
||
166 | width := 15; |
||
167 | width := width - LENGTH(TARGETS.Targets[target].ComLinePar) - 4; |
||
168 | C.String(" '"); C.String(TARGETS.Targets[target].ComLinePar); C.String("'"); |
||
169 | WHILE width > 0 DO |
||
170 | C.String(20X); |
||
171 | DEC(width) |
||
172 | END; |
||
173 | C.StringLn(text) |
||
174 | END OutTargetItem; |
||
175 | |||
176 | |||
7597 | akron1 | 177 | PROCEDURE main; |
178 | VAR |
||
179 | path: PARS.PATH; |
||
180 | inname: PARS.PATH; |
||
181 | ext: PARS.PATH; |
||
182 | app_path: PARS.PATH; |
||
183 | lib_path: PARS.PATH; |
||
184 | modname: PARS.PATH; |
||
185 | outname: PARS.PATH; |
||
186 | param: PARS.PATH; |
||
187 | temp: PARS.PATH; |
||
188 | target: INTEGER; |
||
189 | time: INTEGER; |
||
7693 | akron1 | 190 | options: PROG.OPTIONS; |
6613 | leency | 191 | |
192 | BEGIN |
||
7693 | akron1 | 193 | options.stack := 2; |
9177 | akron1 | 194 | options.tab := TEXTDRV.defTabSize; |
7693 | akron1 | 195 | options.version := 65536; |
196 | options.pic := FALSE; |
||
8097 | maxcodehac | 197 | options.lower := FALSE; |
9579 | akron1 | 198 | options.uses := FALSE; |
7693 | akron1 | 199 | options.checking := ST.chkALL; |
6613 | leency | 200 | |
7597 | akron1 | 201 | PATHS.GetCurrentDirectory(app_path); |
6613 | leency | 202 | |
8859 | leency | 203 | UTILS.GetArg(0, temp); |
204 | PATHS.split(temp, path, modname, ext); |
||
205 | IF PATHS.isRelative(path) THEN |
||
206 | PATHS.RelPath(app_path, path, temp); |
||
207 | path := temp |
||
208 | END; |
||
209 | lib_path := path; |
||
210 | |||
7597 | akron1 | 211 | UTILS.GetArg(1, inname); |
8859 | leency | 212 | STRINGS.replace(inname, "\", UTILS.slash); |
213 | STRINGS.replace(inname, "/", UTILS.slash); |
||
6613 | leency | 214 | |
7693 | akron1 | 215 | C.Ln; |
7983 | leency | 216 | C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor); |
8859 | leency | 217 | C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit) " + UTILS.Date); |
218 | C.StringLn("Copyright (c) 2018-2021, Anton Krotov"); |
||
7693 | akron1 | 219 | |
7597 | akron1 | 220 | IF inname = "" THEN |
7693 | akron1 | 221 | C.Ln; |
7696 | akron1 | 222 | C.StringLn("Usage: Compiler |
7983 | leency | 223 | C.StringLn("target ="); |
7597 | akron1 | 224 | IF UTILS.bit_depth = 64 THEN |
7983 | leency | 225 | OutTargetItem(TARGETS.Win64C, "Windows64 Console"); |
226 | OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI"); |
||
227 | OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL"); |
||
228 | OutTargetItem(TARGETS.Linux64, "Linux64 Exec"); |
||
229 | OutTargetItem(TARGETS.Linux64SO, "Linux64 SO") |
||
7107 | akron1 | 230 | END; |
7983 | leency | 231 | OutTargetItem(TARGETS.Win32C, "Windows32 Console"); |
232 | OutTargetItem(TARGETS.Win32GUI, "Windows32 GUI"); |
||
233 | OutTargetItem(TARGETS.Win32DLL, "Windows32 DLL"); |
||
234 | OutTargetItem(TARGETS.Linux32, "Linux32 Exec"); |
||
235 | OutTargetItem(TARGETS.Linux32SO, "Linux32 SO"); |
||
236 | OutTargetItem(TARGETS.KolibriOS, "KolibriOS Exec"); |
||
237 | OutTargetItem(TARGETS.KolibriOSDLL, "KolibriOS DLL"); |
||
238 | OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers"); |
||
239 | OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers"); |
||
240 | C.Ln; |
||
7597 | akron1 | 241 | C.StringLn("optional settings:"); C.Ln; |
7983 | leency | 242 | C.StringLn(" -out |
243 | C.StringLn(" -stk |
||
244 | C.StringLn(" -nochk <'ptibcwra'> disable runtime checking (pointers, types, indexes,"); |
||
245 | C.StringLn(" BYTE, CHR, WCHR)"); C.Ln; |
||
8097 | maxcodehac | 246 | C.StringLn(" -lower allow lower case for keywords"); C.Ln; |
247 | C.StringLn(" -def |
||
7983 | leency | 248 | C.StringLn(" -ver |
249 | C.StringLn(" -ram |
||
250 | C.StringLn(" -rom |
||
9177 | akron1 | 251 | C.StringLn(" -tab |
9579 | akron1 | 252 | C.StringLn(" -uses list imported modules"); C.Ln; |
7597 | akron1 | 253 | UTILS.Exit(0) |
6613 | leency | 254 | END; |
255 | |||
8859 | leency | 256 | C.Dashes; |
7597 | akron1 | 257 | PATHS.split(inname, path, modname, ext); |
6613 | leency | 258 | |
7983 | leency | 259 | IF ext # UTILS.FILE_EXT THEN |
7693 | akron1 | 260 | ERRORS.Error(207) |
6613 | leency | 261 | END; |
7693 | akron1 | 262 | |
7597 | akron1 | 263 | IF PATHS.isRelative(path) THEN |
264 | PATHS.RelPath(app_path, path, temp); |
||
265 | path := temp |
||
6613 | leency | 266 | END; |
267 | |||
7696 | akron1 | 268 | UTILS.GetArg(2, param); |
7597 | akron1 | 269 | IF param = "" THEN |
7693 | akron1 | 270 | ERRORS.Error(205) |
6613 | leency | 271 | END; |
272 | |||
8097 | maxcodehac | 273 | SCAN.NewDef(param); |
274 | |||
7983 | leency | 275 | IF TARGETS.Select(param) THEN |
276 | target := TARGETS.target |
||
277 | ELSE |
||
7693 | akron1 | 278 | ERRORS.Error(206) |
6613 | leency | 279 | END; |
280 | |||
8859 | leency | 281 | IF TARGETS.CPU = TARGETS.cpuMSP430 THEN |
7693 | akron1 | 282 | options.ram := MSP430.minRAM; |
283 | options.rom := MSP430.minROM |
||
284 | END; |
||
6613 | leency | 285 | |
8859 | leency | 286 | IF (TARGETS.CPU = TARGETS.cpuTHUMB) & (TARGETS.OS = TARGETS.osNONE) THEN |
287 | options.ram := THUMB.minRAM; |
||
288 | options.rom := THUMB.minROM |
||
7983 | leency | 289 | END; |
290 | |||
291 | IF UTILS.bit_depth < TARGETS.BitDepth THEN |
||
7693 | akron1 | 292 | ERRORS.Error(206) |
6613 | leency | 293 | END; |
294 | |||
7597 | akron1 | 295 | STRINGS.append(lib_path, "lib"); |
296 | STRINGS.append(lib_path, UTILS.slash); |
||
7983 | leency | 297 | STRINGS.append(lib_path, TARGETS.LibDir); |
7597 | akron1 | 298 | STRINGS.append(lib_path, UTILS.slash); |
6613 | leency | 299 | |
7696 | akron1 | 300 | keys(options, outname); |
9177 | akron1 | 301 | TEXTDRV.setTabSize(options.tab); |
7696 | akron1 | 302 | IF outname = "" THEN |
303 | outname := path; |
||
304 | STRINGS.append(outname, modname); |
||
7983 | leency | 305 | STRINGS.append(outname, TARGETS.FileExt) |
7696 | akron1 | 306 | ELSE |
307 | IF PATHS.isRelative(outname) THEN |
||
308 | PATHS.RelPath(app_path, outname, temp); |
||
309 | outname := temp |
||
310 | END |
||
311 | END; |
||
312 | |||
7983 | leency | 313 | PARS.init(options); |
6613 | leency | 314 | |
8859 | leency | 315 | CASE TARGETS.OS OF |
316 | |TARGETS.osNONE: |
||
317 | |TARGETS.osWIN32, |
||
318 | TARGETS.osWIN64: SCAN.NewDef(DEF_WINDOWS) |
||
319 | |TARGETS.osLINUX32, |
||
320 | TARGETS.osLINUX64: SCAN.NewDef(DEF_LINUX) |
||
321 | |TARGETS.osKOS: SCAN.NewDef(DEF_KOLIBRIOS) |
||
322 | END; |
||
323 | |||
324 | CASE TARGETS.CPU OF |
||
325 | |TARGETS.cpuX86: SCAN.NewDef(DEF_CPU_X86) |
||
326 | |TARGETS.cpuAMD64: SCAN.NewDef(DEF_CPU_X8664) |
||
327 | |TARGETS.cpuMSP430: |
||
328 | |TARGETS.cpuTHUMB: |
||
329 | |TARGETS.cpuRVM32I: |
||
330 | |TARGETS.cpuRVM64I: |
||
331 | END; |
||
332 | |||
7693 | akron1 | 333 | ST.compile(path, lib_path, modname, outname, target, options); |
334 | |||
7597 | akron1 | 335 | time := UTILS.GetTickCount() - UTILS.time; |
8859 | leency | 336 | C.Dashes; |
7696 | akron1 | 337 | C.Int(PARS.lines); C.String(" lines, "); |
7597 | akron1 | 338 | C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, "); |
339 | C.Int(WRITER.counter); C.StringLn(" bytes"); |
||
6613 | leency | 340 | |
7597 | akron1 | 341 | UTILS.Exit(0) |
342 | END main; |
||
343 | |||
344 | |||
6613 | leency | 345 | BEGIN |
7597 | akron1 | 346 | main |
7983 | leency | 347 | END Compiler.>'ptibcwra'>=>=> |