-
Notifications
You must be signed in to change notification settings - Fork 1
/
ProtoInfile.java
323 lines (269 loc) · 11.3 KB
/
ProtoInfile.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
/* M2J -- Modula-2 to Java Translator & Compiler
*
* Copyright (c) 2016 The Modula-2 Software Foundation
*
* Author & Maintainer: Benjamin Kowarsch <[email protected]>
*
* @synopsis
*
* M2J is a multi-dialect Modula-2 to Java translator and via-Java compiler.
* It supports the dialects described in the 3rd and 4th editions of Niklaus
* Wirth's book "Programming in Modula-2" (PIM) published by Springer Verlag,
* and an extended mode with select features from the revised language by
* B.Kowarsch and R.Sutcliffe "Modula-2 Revision 2010" (M2R10).
*
* In translator mode, M2J translates Modula-2 source to Java source files.
* In compiler mode, M2J compiles Modula-2 source via Java source files
* to Java .class files using the host system's resident Java compiler.
*
* @repository
*
* https://github.com/m2sf/m2j
*
* @file
*
* ProtoInfile.java
*
* Public interface for M2J source file reader.
*
* @license
*
* M2J is free software: you can redistribute and/or modify it under the
* terms of the GNU Lesser General Public License (LGPL) either version 2.1
* or at your choice version 3 as published by the Free Software Foundation.
* However, you may not alter the copyright, author and license information.
*
* M2J is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. Read the license for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with m2j. If not, see <https://www.gnu.org/copyleft/lesser.html>.
*
* NB: Components in the domain part of email addresses are in reverse order.
*/
package org.m2sf.m2j;
interface ProtoInfile {
/* ---------------------------------------------------------------------------
* File size, line and column counter limits
* ------------------------------------------------------------------------ */
public static int INFILE_MAX_SIZE = 260000; /* chars */
public static int INFILE_MAX_LINES = 64000; /* lines */
public static int INFILE_MAX_COLUMNS = 250; /* columns */
/* ---------------------------------------------------------------------------
* Infile status codes
* ------------------------------------------------------------------------ */
public enum Status {
INFILE_STATUS_SUCCESS,
INFILE_STATUS_INVALID_REFERENCE,
INFILE_STATUS_FILE_NOT_FOUND,
INFILE_STATUS_FILE_ACCESS_DENIED,
INFILE_STATUS_ALLOCATION_FAILED,
INFILE_STATUS_FILE_EMPTY,
INFILE_STATUS_ATTEMPT_TO_READ_PAST_EOF,
INFILE_STATUS_IO_SUBSYSTEM_ERROR
} /* Status */
/* ---------------------------------------------------------------------------
* constructor open(filename)
* ---------------------------------------------------------------------------
* Opens the given file, creates a new infile instance, associates the file
* with the newly created instance and returns a result pair with the infile
* reference and a status code.
*
* pre-conditions:
* o filename must reference an existing, accessible file.
*
* post-conditions:
* o new infile created and returned
* o line and column counters of the newly created infile are set to 1
* o INFILE_STATUS_SUCCESS is returned in status
*
* error-conditions:
* o if the file represented by filename cannot be found
* infile is null, status is INFILE_STATUS_FILE_NOT_FOUND
* o if the file represented by filename cannot be accessed
* infile is null, status is INFILE_STATUS_FILE_ACCESS_DENIED
* ------------------------------------------------------------------------ */
public Result<ProtoInfile, Status> open (String filename);
/* ---------------------------------------------------------------------------
* method readChar()
* ---------------------------------------------------------------------------
* Reads the lookahead character from infile, advancing the current reading
* position, updating line and column counter and returns its character code.
* Returns EOT if the lookahead character lies beyond the end of infile.
*
* pre-conditions:
* o infile must be open
*
* post-conditions:
* o character code of lookahead character or EOT is returned
* o current reading position and line and column counters are updated
* o infile status is set to INFILE_STATUS_SUCCESS
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
public char readChar ();
/* ---------------------------------------------------------------------------
* method markLexeme()
* ---------------------------------------------------------------------------
* Marks the current lookahead character as the start of a lexeme.
*
* pre-conditions:
* o infile must be open
*
* post-conditions:
* o position of lookahead character is stored internally
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
public void markLexeme ();
/* ---------------------------------------------------------------------------
* method readMarkedLexeme()
* ---------------------------------------------------------------------------
* Returns a string object with the character sequence starting with the
* character that has been marked using method markLexeme() and ending
* with the last consumed character. Returns null if no marker has
* been set or if the marked character has not been consumed yet.
*
* pre-conditions:
* o infile must be open
* o lexeme must have been marked using method markLexeme()
* o character at the marked position must have been consumed
*
* post-conditions:
* o marked position is cleared
* o string with lexeme is returned
*
* error-conditions:
* o if no marker has been set or marked character has not been consumed,
* no operation is carried out and null is returned
* ------------------------------------------------------------------------ */
public String readMarkedLexeme ();
/* ---------------------------------------------------------------------------
* method sourceForLine(line)
* ---------------------------------------------------------------------------
* Returns a string object with the source of the given line number.
*
* pre-conditions:
* o infile must be open
* o parameter line must be greater than zero
*
* post-conditions:
* o string with source of line is returned
*
* error-conditions:
* o line is negative or zero upon entry,
* no operation is carried out and null is returned
* ------------------------------------------------------------------------ */
public String sourceForLine (int line);
/* ---------------------------------------------------------------------------
* method consumeChar()
* ---------------------------------------------------------------------------
* Consumes the current lookahead character, advancing the current reading
* position, updating line and column counter and returns the character code
* of the new lookahead character that follows the consumed character.
* Returns ASCII.EOT if the lookahead character lies beyond the end of infile.
*
* pre-conditions:
* o infile must be open
*
* post-conditions:
* o character code of lookahead character or ASCII.EOT is returned
* o current reading position and line and column counters are updated
* o file status is set to INFILE_STATUS_SUCCESS
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
public int consumeChar ();
/* ---------------------------------------------------------------------------
* method nextChar()
* ---------------------------------------------------------------------------
* Reads the lookahead character from infile without advancing the current
* reading position and returns its character code. Returns ASCII.EOT if the
* lookahead character lies beyond the end of infile.
*
* pre-conditions:
* o infile must be open
*
* post-conditions:
* o character code of lookahead character or EOT is returned
* o current reading position and line and column counters are NOT updated
* o file status is set to INFILE_STATUS_SUCCESS
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
public int nextChar ();
/* ---------------------------------------------------------------------------
* method la2Char()
* ---------------------------------------------------------------------------
* Reads the second lookahead character from infile without advancing the
* current reading position and returns its character code. Returns ASCII.EOT
* if the second lookahead character lies beyond the end of infile.
*
* pre-conditions:
* o infile must be open
*
* post-conditions:
* o character code of second lookahead character or ASCII.EOT is returned
* o current reading position and line and column counters are NOT updated
* o file status is set to INFILE_STATUS_SUCCESS
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
public int la2Char ();
/* ---------------------------------------------------------------------------
* method filename()
* ---------------------------------------------------------------------------
* Returns the filename associated with infile.
* ------------------------------------------------------------------------ */
public String filename ();
/* ---------------------------------------------------------------------------
* method status()
* ---------------------------------------------------------------------------
* Returns the status of the last operation on infile.
* ------------------------------------------------------------------------ */
public Status status ();
/* ---------------------------------------------------------------------------
* method eof()
* ---------------------------------------------------------------------------
* Returns true if the current reading position of infile lies beyond the end
* of the associated file, returns false otherwise. This method should be
* called whenever ASCII.EOT is read to ascertain that EOF has been reached.
* ------------------------------------------------------------------------ */
public boolean eof ();
/* ---------------------------------------------------------------------------
* method currentLine()
* ---------------------------------------------------------------------------
* Returns the current line counter of infile.
* ------------------------------------------------------------------------ */
public int currentLine ();
/* ---------------------------------------------------------------------------
* method currentColumn()
* ---------------------------------------------------------------------------
* Returns the current column counter of infile.
* ------------------------------------------------------------------------ */
public int currentColumn ();
/* ---------------------------------------------------------------------------
* method close()
* ---------------------------------------------------------------------------
* Closes the file associated with handle file, deallocates its file object
* and returns a status code.
*
* pre-conditions:
* o infile must be open
*
* post-conditions:
* o associated file is closed
* o INFILE_STATUS_SUCCESS is returned
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
public Status close ();
} /* ProtoInfile */
/* END OF FILE */