mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
5.7 KiB
202 lines
5.7 KiB
/*---------------------------------------------------------------------- |
|
Compiler Generator Coco/R, |
|
Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz |
|
extended by M. Loeberbauer & A. Woess, Univ. of Linz |
|
with improvements by Pat Terry, Rhodes University |
|
|
|
This program is free software; you can redistribute it and/or modify it |
|
under the terms of the GNU General Public License as published by the |
|
Free Software Foundation; either version 2, or (at your option) any |
|
later version. |
|
|
|
This program 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. See the GNU General Public License |
|
for more details. |
|
|
|
You should have received a copy of the GNU General Public License along |
|
with this program; if not, write to the Free Software Foundation, Inc., |
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
|
|
As an exception, it is allowed to write an extension of Coco/R that is |
|
used as a plugin in non-free software. |
|
|
|
If not otherwise stated, any source code generated by Coco/R (other than |
|
Coco/R itself) does not fall under the GNU General Public License. |
|
-----------------------------------------------------------------------*/ |
|
-->begin |
|
using System; |
|
using System.IO; |
|
using System.Collections; |
|
using System.Text; |
|
|
|
-->namespace |
|
|
|
public class Token { |
|
public int kind; // token kind |
|
public int pos; // token position in the source text (starting at 0) |
|
public int col; // token column (starting at 0) |
|
public int line; // token line (starting at 1) |
|
public string val; // token value |
|
public Token next; // AW 2003-03-07 Tokens are kept in linked list |
|
} |
|
|
|
public class Buffer { |
|
public const char EOF = (char)256; |
|
static byte[] buf; |
|
static int bufLen; |
|
static int pos; |
|
// CHANGES by M.KRUEGER |
|
public static int CountLines(int offset) |
|
{ |
|
int line = 0; |
|
for (int i = 0; i <= offset; ++i) { |
|
if (buf[i] == '\n') { |
|
++line; |
|
} |
|
} |
|
return line; |
|
} |
|
//EOC |
|
public static void Fill (Stream s) { |
|
bufLen = (int) s.Length; |
|
buf = new byte[bufLen]; |
|
s.Read(buf, 0, bufLen); |
|
pos = 0; |
|
} |
|
|
|
public static int Read () { |
|
if (pos < bufLen) return buf[pos++]; |
|
else return EOF; /* pdt */ |
|
} |
|
|
|
public static int Peek () { |
|
if (pos < bufLen) return buf[pos]; |
|
else return EOF; /* pdt */ |
|
} |
|
|
|
/* AW 2003-03-10 moved this from ParserGen.cs */ |
|
public static string GetString (int beg, int end) { |
|
StringBuilder s = new StringBuilder(64); |
|
int oldPos = Buffer.Pos; |
|
Buffer.Pos = beg; |
|
while (beg < end) { s.Append((char)Buffer.Read()); beg++; } |
|
Buffer.Pos = oldPos; |
|
return s.ToString(); |
|
} |
|
|
|
public static int Pos { |
|
get { return pos; } |
|
set { |
|
if (value < 0) pos = 0; |
|
else if (value >= bufLen) pos = bufLen; |
|
else pos = value; |
|
} |
|
} |
|
} |
|
|
|
public class Scanner { |
|
const char EOL = '\n'; |
|
const int eofSym = 0; /* pdt */ |
|
-->declarations |
|
|
|
static Token t; // current token |
|
static char ch; // current input character |
|
static int pos; // column number of current character |
|
static int line; // line number of current character |
|
static int lineStart; // start position of current line |
|
static int oldEols; // EOLs that appeared in a comment; |
|
static BitArray ignore; // set of characters to be ignored by the scanner |
|
|
|
static Token tokens; // the complete input token stream |
|
static Token pt; // current peek token |
|
|
|
public static void Init (string fileName) { |
|
FileStream s = null; |
|
try { |
|
s = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); |
|
Init(s); |
|
} catch (IOException) { |
|
Console.WriteLine("--- Cannot open file {0}", fileName); |
|
System.Environment.Exit(1); |
|
} finally { |
|
if (s != null) s.Close(); |
|
} |
|
} |
|
|
|
public static void Init (Stream s) { |
|
Buffer.Fill(s); |
|
pos = -1; line = 1; lineStart = 0; |
|
oldEols = 0; |
|
NextCh(); |
|
-->initialization |
|
//--- AW: fill token list |
|
tokens = new Token(); // first token is a dummy |
|
Token node = tokens; |
|
do { |
|
node.next = NextToken(); |
|
node = node.next; |
|
} while (node.kind != eofSym); |
|
node.next = node; |
|
node.val = "EOF"; |
|
t = pt = tokens; |
|
} |
|
|
|
static void NextCh() { |
|
if (oldEols > 0) { ch = EOL; oldEols--; } |
|
else { |
|
ch = (char)Buffer.Read(); pos++; |
|
// replace isolated '\r' by '\n' in order to make |
|
// eol handling uniform across Windows, Unix and Mac |
|
if (ch == '\r' && Buffer.Peek() != '\n') ch = EOL; |
|
if (ch == EOL) { line++; lineStart = pos + 1; } |
|
} |
|
-->casing |
|
} |
|
|
|
-->comments |
|
|
|
static void CheckLiteral() { |
|
-->literals |
|
} |
|
|
|
/* AW Scan() renamed to NextToken() */ |
|
static Token NextToken() { |
|
while (ignore[ch]) NextCh(); |
|
-->scan1 |
|
t = new Token(); |
|
t.pos = pos; t.col = pos - lineStart + 1; t.line = line; |
|
int state = start[ch]; |
|
StringBuilder buf = new StringBuilder(16); |
|
-->scan2 |
|
|
|
switch (state) { |
|
case -1: { t.kind = eofSym; goto done; } // NextCh already done /* pdt */ |
|
case 0: { t.kind = noSym; goto done; } // NextCh already done |
|
-->scan3 |
|
} |
|
done: |
|
t.val = buf.ToString(); |
|
return t; |
|
} |
|
|
|
/* AW 2003-03-07 get the next token, move on and synch peek token with current */ |
|
public static Token Scan () { |
|
t = pt = t.next; |
|
return t; |
|
} |
|
|
|
/* AW 2003-03-07 get the next token, ignore pragmas */ |
|
public static Token Peek () { |
|
do { // skip pragmas while peeking |
|
pt = pt.next; |
|
} while (pt.kind > maxT); |
|
return pt; |
|
} |
|
|
|
/* AW 2003-03-11 to make sure peek start at current scan position */ |
|
public static void ResetPeek () { pt = t; } |
|
|
|
} // end Scanner |
|
|
|
$$$ |