Rev 7667 | Rev 7696 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7597 | akron1 | 1 | (* |
2 | BSD 2-Clause License |
||
3 | |||
4 | Copyright (c) 2018, 2019, Anton Krotov |
||
5 | All rights reserved. |
||
6 | *) |
||
7 | |||
8 | MODULE STATEMENTS; |
||
9 | |||
10 | IMPORT |
||
11 | |||
7693 | akron1 | 12 | PARS, PROG, SCAN, ARITH, STRINGS, LISTS, IL, X86, AMD64, MSP430, |
13 | ERRORS, UTILS, AVL := AVLTREES, CONSOLE, C := COLLECTIONS, mConst := CONSTANTS; |
||
7597 | akron1 | 14 | |
15 | |||
16 | CONST |
||
17 | |||
18 | eCONST = PARS.eCONST; eTYPE = PARS.eTYPE; eVAR = PARS.eVAR; |
||
19 | eEXPR = PARS.eEXPR; eVREC = PARS.eVREC; ePROC = PARS.ePROC; |
||
20 | eVPAR = PARS.eVPAR; ePARAM = PARS.ePARAM; eSTPROC = PARS.eSTPROC; |
||
21 | eSTFUNC = PARS.eSTFUNC; eSYSFUNC = PARS.eSYSFUNC; eSYSPROC = PARS.eSYSPROC; |
||
22 | eIMP = PARS.eIMP; |
||
23 | |||
7693 | akron1 | 24 | errASSERT = 1; errPTR = 2; errDIV = 3; errPROC = 4; |
25 | errGUARD = 5; errIDX = 6; errCASE = 7; errCOPY = 8; |
||
7597 | akron1 | 26 | errCHR = 9; errWCHR = 10; errBYTE = 11; |
27 | |||
28 | chkIDX* = 0; chkGUARD* = 1; chkPTR* = 2; chkCHR* = 3; chkWCHR* = 4; chkBYTE* = 5; |
||
29 | |||
30 | chkALL* = {chkIDX, chkGUARD, chkPTR, chkCHR, chkWCHR, chkBYTE}; |
||
31 | |||
7693 | akron1 | 32 | cpuX86 = 1; cpuAMD64 = 2; cpuMSP430 = 3; |
7597 | akron1 | 33 | |
7693 | akron1 | 34 | |
7597 | akron1 | 35 | TYPE |
36 | |||
37 | isXXX = PROCEDURE (e: PARS.EXPR): BOOLEAN; |
||
38 | |||
39 | RANGE = RECORD |
||
40 | |||
41 | a, b: INTEGER |
||
42 | |||
43 | END; |
||
44 | |||
45 | CASE_LABEL = POINTER TO rCASE_LABEL; |
||
46 | |||
47 | rCASE_LABEL = RECORD (AVL.DATA) |
||
48 | |||
49 | range: RANGE; |
||
50 | |||
51 | variant, self: INTEGER; |
||
52 | |||
53 | type: PROG.TYPE_; |
||
54 | |||
55 | prev: CASE_LABEL |
||
56 | |||
57 | END; |
||
58 | |||
59 | CASE_VARIANT = POINTER TO RECORD (LISTS.ITEM) |
||
60 | |||
7693 | akron1 | 61 | label: INTEGER; |
62 | cmd: IL.COMMAND; |
||
63 | processed: BOOLEAN |
||
7597 | akron1 | 64 | |
65 | END; |
||
66 | |||
67 | |||
68 | VAR |
||
69 | |||
7693 | akron1 | 70 | Options: PROG.OPTIONS; |
7597 | akron1 | 71 | |
7693 | akron1 | 72 | begcall, endcall: IL.COMMAND; |
7597 | akron1 | 73 | |
74 | CaseLabels, CaseVar: C.COLLECTION; |
||
75 | |||
76 | CaseVariants: LISTS.LIST; |
||
77 | |||
7693 | akron1 | 78 | CPU: INTEGER; |
7597 | akron1 | 79 | |
7693 | akron1 | 80 | tINTEGER, tBYTE, tCHAR, tWCHAR, tSET, tBOOLEAN, tREAL: PROG.TYPE_; |
81 | |||
82 | |||
7597 | akron1 | 83 | PROCEDURE isExpr (e: PARS.EXPR): BOOLEAN; |
84 | RETURN e.obj IN {eCONST, eVAR, eEXPR, eVPAR, ePARAM, eVREC} |
||
85 | END isExpr; |
||
86 | |||
87 | |||
88 | PROCEDURE isVar (e: PARS.EXPR): BOOLEAN; |
||
89 | RETURN e.obj IN {eVAR, eVPAR, ePARAM, eVREC} |
||
90 | END isVar; |
||
91 | |||
92 | |||
93 | PROCEDURE isBoolean (e: PARS.EXPR): BOOLEAN; |
||
7693 | akron1 | 94 | RETURN isExpr(e) & (e.type = tBOOLEAN) |
7597 | akron1 | 95 | END isBoolean; |
96 | |||
97 | |||
98 | PROCEDURE isInteger (e: PARS.EXPR): BOOLEAN; |
||
7693 | akron1 | 99 | RETURN isExpr(e) & (e.type = tINTEGER) |
7597 | akron1 | 100 | END isInteger; |
101 | |||
102 | |||
103 | PROCEDURE isByte (e: PARS.EXPR): BOOLEAN; |
||
7693 | akron1 | 104 | RETURN isExpr(e) & (e.type = tBYTE) |
7597 | akron1 | 105 | END isByte; |
106 | |||
107 | |||
108 | PROCEDURE isInt (e: PARS.EXPR): BOOLEAN; |
||
109 | RETURN isByte(e) OR isInteger(e) |
||
110 | END isInt; |
||
111 | |||
112 | |||
113 | PROCEDURE isReal (e: PARS.EXPR): BOOLEAN; |
||
7693 | akron1 | 114 | RETURN isExpr(e) & (e.type = tREAL) |
7597 | akron1 | 115 | END isReal; |
116 | |||
117 | |||
118 | PROCEDURE isSet (e: PARS.EXPR): BOOLEAN; |
||
7693 | akron1 | 119 | RETURN isExpr(e) & (e.type = tSET) |
7597 | akron1 | 120 | END isSet; |
121 | |||
122 | |||
123 | PROCEDURE isString (e: PARS.EXPR): BOOLEAN; |
||
124 | RETURN (e.obj = eCONST) & (e.type.typ IN {PROG.tSTRING, PROG.tCHAR}) |
||
125 | END isString; |
||
126 | |||
127 | |||
128 | PROCEDURE isStringW (e: PARS.EXPR): BOOLEAN; |
||
129 | RETURN (e.obj = eCONST) & (e.type.typ IN {PROG.tSTRING, PROG.tCHAR, PROG.tWCHAR}) |
||
130 | END isStringW; |
||
131 | |||
132 | |||
133 | PROCEDURE isChar (e: PARS.EXPR): BOOLEAN; |
||
7693 | akron1 | 134 | RETURN isExpr(e) & (e.type = tCHAR) |
7597 | akron1 | 135 | END isChar; |
136 | |||
137 | |||
138 | PROCEDURE isCharW (e: PARS.EXPR): BOOLEAN; |
||
7693 | akron1 | 139 | RETURN isExpr(e) & (e.type = tWCHAR) |
7597 | akron1 | 140 | END isCharW; |
141 | |||
142 | |||
143 | PROCEDURE isPtr (e: PARS.EXPR): BOOLEAN; |
||
144 | RETURN isExpr(e) & (e.type.typ = PROG.tPOINTER) |
||
145 | END isPtr; |
||
146 | |||
147 | |||
148 | PROCEDURE isRec (e: PARS.EXPR): BOOLEAN; |
||
149 | RETURN isExpr(e) & (e.type.typ = PROG.tRECORD) |
||
150 | END isRec; |
||
151 | |||
152 | |||
7693 | akron1 | 153 | PROCEDURE isRecPtr (e: PARS.EXPR): BOOLEAN; |
154 | RETURN isRec(e) OR isPtr(e) |
||
155 | END isRecPtr; |
||
156 | |||
157 | |||
7597 | akron1 | 158 | PROCEDURE isArr (e: PARS.EXPR): BOOLEAN; |
159 | RETURN isExpr(e) & (e.type.typ = PROG.tARRAY) |
||
160 | END isArr; |
||
161 | |||
162 | |||
163 | PROCEDURE isProc (e: PARS.EXPR): BOOLEAN; |
||
164 | RETURN isExpr(e) & (e.type.typ = PROG.tPROCEDURE) OR (e.obj IN {ePROC, eIMP}) |
||
165 | END isProc; |
||
166 | |||
167 | |||
168 | PROCEDURE isNil (e: PARS.EXPR): BOOLEAN; |
||
169 | RETURN e.type.typ = PROG.tNIL |
||
170 | END isNil; |
||
171 | |||
172 | |||
7693 | akron1 | 173 | PROCEDURE isCharArray (e: PARS.EXPR): BOOLEAN; |
174 | RETURN isArr(e) & (e.type.base = tCHAR) |
||
175 | END isCharArray; |
||
176 | |||
177 | |||
178 | PROCEDURE isCharArrayW (e: PARS.EXPR): BOOLEAN; |
||
179 | RETURN isArr(e) & (e.type.base = tWCHAR) |
||
180 | END isCharArrayW; |
||
181 | |||
182 | |||
183 | PROCEDURE isCharArrayX (e: PARS.EXPR): BOOLEAN; |
||
184 | RETURN isCharArray(e) OR isCharArrayW(e) |
||
185 | END isCharArrayX; |
||
186 | |||
187 | |||
188 | PROCEDURE getpos (parser: PARS.PARSER; VAR pos: PARS.POSITION); |
||
7597 | akron1 | 189 | BEGIN |
7693 | akron1 | 190 | pos.line := parser.lex.pos.line; |
191 | pos.col := parser.lex.pos.col; |
||
192 | pos.parser := parser |
||
7597 | akron1 | 193 | END getpos; |
194 | |||
195 | |||
7693 | akron1 | 196 | PROCEDURE NextPos (parser: PARS.PARSER; VAR pos: PARS.POSITION); |
7597 | akron1 | 197 | BEGIN |
7693 | akron1 | 198 | PARS.Next(parser); |
199 | getpos(parser, pos) |
||
7597 | akron1 | 200 | END NextPos; |
201 | |||
202 | |||
203 | PROCEDURE strlen (e: PARS.EXPR): INTEGER; |
||
204 | VAR |
||
205 | res: INTEGER; |
||
206 | |||
207 | BEGIN |
||
208 | ASSERT(isString(e)); |
||
7693 | akron1 | 209 | IF e.type = tCHAR THEN |
7597 | akron1 | 210 | res := 1 |
211 | ELSE |
||
212 | res := LENGTH(e.value.string(SCAN.IDENT).s) |
||
213 | END |
||
214 | RETURN res |
||
215 | END strlen; |
||
216 | |||
217 | |||
218 | PROCEDURE _length (s: ARRAY OF CHAR): INTEGER; |
||
219 | VAR |
||
220 | i, res: INTEGER; |
||
221 | |||
222 | BEGIN |
||
223 | i := 0; |
||
224 | res := 0; |
||
225 | WHILE (i < LEN(s)) & (s[i] # 0X) DO |
||
226 | IF (s[i] <= CHR(127)) OR (s[i] >= CHR(192)) THEN |
||
227 | INC(res) |
||
228 | END; |
||
229 | INC(i) |
||
230 | END |
||
231 | |||
232 | RETURN res |
||
233 | END _length; |
||
234 | |||
235 | |||
236 | PROCEDURE utf8strlen (e: PAR |