Rev 7983 | 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 | |
7983 | leency | 4 | Copyright (c) 2018-2020, 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, |
8097 | maxcodehac | 11 | ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS, SCAN; |
6613 | leency | 12 | |
13 | |||
7696 | akron1 | 14 | PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH); |
6613 | leency | 15 | VAR |
7597 | akron1 | 16 | param: PARS.PATH; |
17 | i, j: INTEGER; |
||
8097 | maxcodehac | 18 | _end: BOOLEAN; |
7597 | akron1 | 19 | value: INTEGER; |
20 | minor, |
||
21 | major: INTEGER; |
||
7693 | akron1 | 22 | checking: SET; |
6613 | leency | 23 | |
24 | BEGIN |
||
7696 | akron1 | 25 | out := ""; |
7693 | akron1 | 26 | checking := options.checking; |
8097 | maxcodehac | 27 | _end := FALSE; |
7696 | akron1 | 28 | i := 3; |
7597 | akron1 | 29 | REPEAT |
30 | UTILS.GetArg(i, param); |
||
6613 | leency | 31 | |
7597 | akron1 | 32 | IF param = "-stk" THEN |
33 | INC(i); |
||
34 | UTILS.GetArg(i, param); |
||
35 | IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN |
||
7693 | akron1 | 36 | options.stack := value |
7597 | akron1 | 37 | END; |
38 | IF param[0] = "-" THEN |
||
39 | DEC(i) |
||
40 | END |
||
6613 | leency | 41 | |
7696 | akron1 | 42 | ELSIF param = "-out" THEN |
7597 | akron1 | 43 | INC(i); |
44 | UTILS.GetArg(i, param); |
||
45 | IF param[0] = "-" THEN |
||
46 | DEC(i) |
||
7696 | akron1 | 47 | ELSE |
48 | out := param |
||
7597 | akron1 | 49 | END |
6613 | leency | 50 | |
7693 | akron1 | 51 | ELSIF param = "-ram" THEN |
52 | INC(i); |
||
53 | UTILS.GetArg(i, param); |
||
54 | IF STRINGS.StrToInt(param, value) THEN |
||
55 | options.ram := value |
||
56 | END; |
||
57 | IF param[0] = "-" THEN |
||
58 | DEC(i) |
||
59 | END |
||
60 | |||
61 | ELSIF param = "-rom" THEN |
||
62 | INC(i); |
||
63 | UTILS.GetArg(i, param); |
||
64 | IF STRINGS.StrToInt(param, value) THEN |
||
65 | options.rom := value |
||
66 | END; |
||
67 | IF param[0] = "-" THEN |
||
68 | DEC(i) |
||
69 | END |
||
70 | |||
7597 | akron1 | 71 | ELSIF param = "-nochk" THEN |
72 | INC(i); |
||
73 | UTILS.GetArg(i, param); |
||
6613 | leency | 74 | |
7597 | akron1 | 75 | IF param[0] = "-" THEN |
76 | DEC(i) |
||
77 | ELSE |
||
78 | j := 0; |
||
79 | WHILE param[j] # 0X DO |
||
6613 | leency | 80 | |
7597 | akron1 | 81 | IF param[j] = "p" THEN |
82 | EXCL(checking, ST.chkPTR) |
||
83 | ELSIF param[j] = "t" THEN |
||
84 | EXCL(checking, ST.chkGUARD) |
||
85 | ELSIF param[j] = "i" THEN |
||
86 | EXCL(checking, ST.chkIDX) |
||
87 | ELSIF param[j] = "b" THEN |
||
88 | EXCL(checking, ST.chkBYTE) |
||
89 | ELSIF param[j] = "c" THEN |
||
90 | EXCL(checking, ST.chkCHR) |
||
91 | ELSIF param[j] = "w" THEN |
||
92 | EXCL(checking, ST.chkWCHR) |
||
93 | ELSIF param[j] = "r" THEN |
||
94 | EXCL(checking, ST.chkCHR); |
||
95 | EXCL(checking, ST.chkWCHR); |
||
96 | EXCL(checking, ST.chkBYTE) |
||
97 | ELSIF param[j] = "a" THEN |
||
98 | checking := {} |
||
99 | END; |
||
6613 | leency | 100 | |
7597 | akron1 | 101 | INC(j) |
7693 | akron1 | 102 | END; |
103 | |||
7597 | akron1 | 104 | END |
6613 | leency | 105 | |
7597 | akron1 | 106 | ELSIF param = "-ver" THEN |
107 | INC(i); |
||
108 | UTILS.GetArg(i, param); |
||
109 | IF STRINGS.StrToVer(param, major, minor) THEN |
||
7693 | akron1 | 110 | options.version := major * 65536 + minor |
7597 | akron1 | 111 | END; |
112 | IF param[0] = "-" THEN |
||
113 | DEC(i) |
||
114 | END |
||
6613 | leency | 115 | |
8097 | maxcodehac | 116 | ELSIF param = "-lower" THEN |
117 | options.lower := TRUE |
||
118 | |||
7597 | akron1 | 119 | ELSIF param = "-pic" THEN |
7693 | akron1 | 120 | options.pic := TRUE |
6613 | leency | 121 | |
8097 | maxcodehac | 122 | ELSIF param = "-def" THEN |
123 | INC(i); |
||
124 | UTILS.GetArg(i, param); |
||
125 | SCAN.NewDef(param) |
||
126 | |||
7597 | akron1 | 127 | ELSIF param = "" THEN |
8097 | maxcodehac | 128 | _end := TRUE |
6613 | leency | 129 | |
7107 | akron1 | 130 | ELSE |
7693 | akron1 | 131 | ERRORS.BadParam(param) |
7107 | akron1 | 132 | END; |
6613 | leency | 133 | |
7597 | akron1 | 134 | INC(i) |
8097 | maxcodehac | 135 | UNTIL _end; |
6613 | leency | 136 | |
7693 | akron1 | 137 | options.checking := checking |
7597 | akron1 | 138 | END keys; |
6613 | leency | 139 | |
140 | |||
7983 | leency | 141 | PROCEDURE OutTargetItem (target: INTEGER; text: ARRAY OF CHAR); |
142 | VAR |
||
143 | width: INTEGER; |
||
144 | |||
145 | BEGIN |
||
146 | width := 15; |
||
147 | width := width - LENGTH(TARGETS.Targets[target].ComLinePar) - 4; |
||
148 | C.String(" '"); C.String(TARGETS.Targets[target].ComLinePar); C.String("'"); |
||
149 | WHILE width > 0 DO |
||
150 | C.String(20X); |
||
151 | DEC(width) |
||
152 | END; |
||
153 | C.StringLn(text) |
||
154 | END OutTargetItem; |
||
155 | |||
156 | |||
7597 | akron1 | 157 | PROCEDURE main; |
158 | VAR |
||
159 | path: PARS.PATH; |
||
160 | inname: PARS.PATH; |
||
161 | ext: PARS.PATH; |
||
162 | app_path: PARS.PATH; |
||
163 | lib_path: PARS.PATH; |
||
164 | modname: PARS.PATH; |
||
165 | outname: PARS.PATH; |
||
166 | param: PARS.PATH; |
||
167 | temp: PARS.PATH; |
||
168 | target: INTEGER; |
||
169 | time: INTEGER; |
||
7693 | akron1 | 170 | options: PROG.OPTIONS; |
6613 | leency | 171 | |
172 | BEGIN |
||
7693 | akron1 | 173 | options.stack := 2; |
174 | options.version := 65536; |
||
175 | options.pic := FALSE; |
||
8097 | maxcodehac | 176 | options.lower := FALSE; |
7693 | akron1 | 177 | options.checking := ST.chkALL; |
6613 | leency | 178 | |
7597 | akron1 | 179 | PATHS.GetCurrentDirectory(app_path); |
180 | lib_path := app_path; |
||
6613 | leency | 181 | |
7597 | akron1 | 182 | UTILS.GetArg(1, inname); |
6613 | leency | 183 | |
7693 | akron1 | 184 | C.Ln; |
7983 | leency | 185 | C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor); |
7693 | akron1 | 186 | C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)"); |
7983 | leency | 187 | C.StringLn("Copyright (c) 2018-2020, Anton Krotov"); |
7693 | akron1 | 188 | |
7597 | akron1 | 189 | IF inname = "" THEN |
7693 | akron1 | 190 | C.Ln; |
7696 | akron1 | 191 | C.StringLn("Usage: Compiler |
7983 | leency | 192 | C.StringLn("target ="); |
7597 | akron1 | 193 | IF UTILS.bit_depth = 64 THEN |
7983 | leency | 194 | OutTargetItem(TARGETS.Win64C, "Windows64 Console"); |
195 | OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI"); |
||
196 | OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL"); |
||
197 | OutTargetItem(TARGETS.Linux64, "Linux64 Exec"); |
||
198 | OutTargetItem(TARGETS.Linux64SO, "Linux64 SO") |
||
7107 | akron1 | 199 | END; |
7983 | leency | 200 | OutTargetItem(TARGETS.Win32C, "Windows32 Console"); |
201 | OutTargetItem(TARGETS.Win32GUI, "Windows32 GUI"); |
||
202 | OutTargetItem(TARGETS.Win32DLL, "Windows32 DLL"); |
||
203 | OutTargetItem(TARGETS.Linux32, "Linux32 Exec"); |
||
204 | OutTargetItem(TARGETS.Linux32SO, "Linux32 SO"); |
||
205 | OutTargetItem(TARGETS.KolibriOS, "KolibriOS Exec"); |
||
206 | OutTargetItem(TARGETS.KolibriOSDLL, "KolibriOS DLL"); |
||
207 | OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers"); |
||
208 | OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers"); |
||
209 | C.Ln; |
||
7597 | akron1 | 210 | C.StringLn("optional settings:"); C.Ln; |
7983 | leency | 211 | C.StringLn(" -out |
212 | C.StringLn(" -stk |
||
213 | C.StringLn(" -nochk <'ptibcwra'> disable runtime checking (pointers, types, indexes,"); |
||
214 | C.StringLn(" BYTE, CHR, WCHR)"); C.Ln; |
||
8097 | maxcodehac | 215 | C.StringLn(" -lower allow lower case for keywords"); C.Ln; |
216 | C.StringLn(" -def |
||
7983 | leency | 217 | C.StringLn(" -ver |
218 | C.StringLn(" -ram |
||
219 | C.StringLn(" -rom |
||
7597 | akron1 | 220 | UTILS.Exit(0) |
6613 | leency | 221 | END; |
222 | |||
7983 | leency | 223 | C.StringLn("--------------------------------------------"); |
7597 | akron1 | 224 | PATHS.split(inname, path, modname, ext); |
6613 | leency | 225 | |
7983 | leency | 226 | IF ext # UTILS.FILE_EXT THEN |
7693 | akron1 | 227 | ERRORS.Error(207) |
6613 | leency | 228 | END; |
7693 | akron1 | 229 | |
7597 | akron1 | 230 | IF PATHS.isRelative(path) THEN |
231 | PATHS.RelPath(app_path, path, temp); |
||
232 | path := temp |
||
6613 | leency | 233 | END; |
234 | |||
7696 | akron1 | 235 | UTILS.GetArg(2, param); |
7597 | akron1 | 236 | IF param = "" THEN |
7693 | akron1 | 237 | ERRORS.Error(205) |
6613 | leency | 238 | END; |
239 | |||
8097 | maxcodehac | 240 | SCAN.NewDef(param); |
241 | |||
7983 | leency | 242 | IF TARGETS.Select(param) THEN |
243 | target := TARGETS.target |
||
244 | ELSE |
||
7693 | akron1 | 245 | ERRORS.Error(206) |
6613 | leency | 246 | END; |
247 | |||
7983 | leency | 248 | IF target = TARGETS.MSP430 THEN |
7693 | akron1 | 249 | options.ram := MSP430.minRAM; |
250 | options.rom := MSP430.minROM |
||
251 | END; |
||
6613 | leency | 252 | |
7983 | leency | 253 | IF target = TARGETS.STM32CM3 THEN |
254 | options.ram := THUMB.STM32_minRAM; |
||
255 | options.rom := THUMB.STM32_minROM |
||
256 | END; |
||
257 | |||
258 | IF UTILS.bit_depth < TARGETS.BitDepth THEN |
||
7693 | akron1 | 259 | ERRORS.Error(206) |
6613 | leency | 260 | END; |
261 | |||
7597 | akron1 | 262 | STRINGS.append(lib_path, "lib"); |
263 | STRINGS.append(lib_path, UTILS.slash); |
||
7983 | leency | 264 | STRINGS.append(lib_path, TARGETS.LibDir); |
7597 | akron1 | 265 | STRINGS.append(lib_path, UTILS.slash); |
6613 | leency | 266 | |
7696 | akron1 | 267 | keys(options, outname); |
268 | IF outname = "" THEN |
||
269 | outname := path; |
||
270 | STRINGS.append(outname, modname); |
||
7983 | leency | 271 | STRINGS.append(outname, TARGETS.FileExt) |
7696 | akron1 | 272 | ELSE |
273 | IF PATHS.isRelative(outname) THEN |
||
274 | PATHS.RelPath(app_path, outname, temp); |
||
275 | outname := temp |
||
276 | END |
||
277 | END; |
||
278 | |||
7983 | leency | 279 | PARS.init(options); |
6613 | leency | 280 | |
7693 | akron1 | 281 | ST.compile(path, lib_path, modname, outname, target, options); |
282 | |||
7597 | akron1 | 283 | time := UTILS.GetTickCount() - UTILS.time; |
7983 | leency | 284 | C.StringLn("--------------------------------------------"); |
7696 | akron1 | 285 | C.Int(PARS.lines); C.String(" lines, "); |
7597 | akron1 | 286 | C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, "); |
287 | C.Int(WRITER.counter); C.StringLn(" bytes"); |
||
6613 | leency | 288 | |
7597 | akron1 | 289 | UTILS.Exit(0) |
290 | END main; |
||
291 | |||
292 | |||
6613 | leency | 293 | BEGIN |
7597 | akron1 | 294 | main |
7983 | leency | 295 | END Compiler.>'ptibcwra'>=>=> |