Subversion Repositories Kolibri OS

Rev

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