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