-
Notifications
You must be signed in to change notification settings - Fork 4
/
IInfile.cs
324 lines (269 loc) · 11.1 KB
/
IInfile.cs
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
324
/* M2Sharp -- Modula-2 to C# Translator & Compiler
*
* Copyright (c) 2016 The Modula-2 Software Foundation
*
* Author & Maintainer: Benjamin Kowarsch <trijezdci@org.m2sf>
*
* @synopsis
*
* M2Sharp is a multi-dialect Modula-2 to C# translator and via-C# 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, M2Sharp translates Modula-2 source to C# source files.
* In compiler mode, M2Sharp compiles Modula-2 source via C# source files
* to object code or executables using the host system's C# compiler.
*
* @repository
*
* https://github.com/m2sf/m2sharp
*
* @file
*
* IInfile.cs
*
* Public interface for M2Sharp source file reader.
*
* @license
*
* M2Sharp 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.
*
* M2Sharp 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 M2Sharp. If not, see <https://www.gnu.org/copyleft/lesser.html>.
*
* NB: Components in the domain part of email addresses are in reverse order.
*/
namespace org.m2sf.m2sharp {
/* ---------------------------------------------------------------------------
* Infile status codes
* ------------------------------------------------------------------------ */
public enum InfileStatus {
Success,
InvalidReference,
FileNotFound,
FileAccessDenied,
AllocationFailed,
SourceFileIsEmpty,
AttemptToReadPastEOF,
IOSubsystemError
} /* InfileStatus */
public interface IInfile {
/* ---------------------------------------------------------------------------
* Properties: file size, line and column counter limits
* ------------------------------------------------------------------------ */
uint MaxSize (); /* returns the maximum file buffer size (260000) */
uint MaxLines (); /* returns the line counter limit (64000) */
uint MaxColumns (); /* returns the column counter limit (250) */
/* ---------------------------------------------------------------------------
* 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 Success is returned in status
*
* error-conditions:
* o if the file represented by filename cannot be found
* infile is null, status is FileNotFound
* o if the file represented by filename cannot be accessed
* infile is null, status is FileAccessDenied
* ------------------------------------------------------------------------ */
Result<IInfile, InfileStatus> 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 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 infile status is set to Success
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
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
* ------------------------------------------------------------------------ */
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
* ------------------------------------------------------------------------ */
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
* ------------------------------------------------------------------------ */
string SourceForLine (uint 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 Success
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
char 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 ASCII.EOT is returned
* o current reading position and line and column counters are NOT updated
* o file status is set to Success
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
char 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 EOT is returned
* o current reading position and line and column counters are NOT updated
* o file status is set to Success
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
char LA2Char ();
/* ---------------------------------------------------------------------------
* method filename()
* ---------------------------------------------------------------------------
* Returns the filename associated with infile.
* ------------------------------------------------------------------------ */
string filename ();
/* ---------------------------------------------------------------------------
* method Status()
* ---------------------------------------------------------------------------
* Returns the status of the last operation on infile.
* ------------------------------------------------------------------------ */
InfileStatus 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.
* ------------------------------------------------------------------------ */
bool EOF ();
/* ---------------------------------------------------------------------------
* method CurrentLine()
* ---------------------------------------------------------------------------
* Returns the current line counter of infile.
* ------------------------------------------------------------------------ */
uint CurrentLine ();
/* ---------------------------------------------------------------------------
* method CurrentColumn()
* ---------------------------------------------------------------------------
* Returns the current column counter of infile.
* ------------------------------------------------------------------------ */
uint CurrentColumn ();
/* ---------------------------------------------------------------------------
* method Close()
* ---------------------------------------------------------------------------
* Closes the file associated with infile and returns a status code.
*
* pre-conditions:
* o infile must be open
*
* post-conditions:
* o associated file is closed
* o Success is returned
*
* error-conditions:
* o none
* ------------------------------------------------------------------------ */
InfileStatus Close ();
} /* IInfile */
} /* M2SF.M2Sharp */
/* END OF FILE */