//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
// PLEASE DO NOT EDIT WITHOUT THE EXPLICIT CONSENT OF THE AUTHOR! \\
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
namespace Ilog.Irl
{
/**
* @version Last modified on Tue May 31 20:24:16 2005 by hak
* @author Hassan Aït-Kaci
* @copyright © 2004 ILOG, Inc.
*/
using Reader = System.IO.TextReader;
using FileReader = System.IO.StreamReader;
using StreamTokenizer = Ilog.Language.IO.StreamTokenizer;
using Ilog.Language.Parsing;
internal class Tokenizer : FileTokenizer
{
private int lineno;
private string file;
private Reader reader;
private StreamTokenizer st;
internal Tokenizer ()
{
}
internal Tokenizer (string file)
{
this.file = file;
SetReader(new FileReader(file));
}
public string FileName
{
get { return file; }
set { file = value; }
}
public int LineNumber
{
get { return lineno; }
}
public void SetReader (Reader rd)
{
reader = rd;
st = new StreamTokenizer(reader);
st.OrdinaryChars("+-.(){}[]<>;,:=!&|*/%");
StreamTokenizer.SetType('.',StreamTokenizer.NUMERIC);
st.QuoteChar('\'');
st.QuoteChar('"');
st.WordChars("_@?$");
}
public Reader GetReader ()
{
return reader;
}
private ParseNode Locate (ParseNode node)
{
return ((ParseNode)node.SetStart(st.TokenStart()).SetEnd(st.TokenEnd())).SetFile(file);
}
private ParseNode Integer ()
{
return Locate(DynamicParser.NumberToken("INTEGER_LITERAL",(int)st.NValue));
}
private ParseNode FloatingPoint ()
{
return Locate(DynamicParser.NumberToken("FLOATING_POINT_LITERAL",st.NValue));
}
private ParseNode String ()
{
return Locate(DynamicParser.SymbolToken("STRING_LITERAL",st.SValue));
}
private ParseNode Character ()
{
return Locate(DynamicParser.SymbolToken("CHARACTER_LITERAL",st.SValue));
}
private ParseNode Identifier (string symbol)
{
return Locate(DynamicParser.SymbolToken("IDENTIFIER",symbol));
}
private ParseNode Variable (string symbol)
{
return Locate(DynamicParser.SymbolToken("VARIABLE",symbol));
}
private ParseNode Literal (string s)
{
return Locate(DynamicParser.LiteralToken(s));
}
private ParseNode Literal (int c)
{
return Locate(DynamicParser.LiteralToken(((char)c).ToString()));
}
public ParseNode NextToken ()
{
ParseNode t = null;
int tk = st.NextToken();
int nextChar = st.Peek();
lineno = st.GetLineNumber();
switch (tk)
{
case StreamTokenizer.TT_SPECIAL:
return NextToken();
case StreamTokenizer.TT_EOF:
t = Locate(DynamicParser.E_O_I);
break;
case StreamTokenizer.TT_NUMBER:
if (st.IsInteger)
t = Integer();
else
t = FloatingPoint();
break;
case '"':
t = String();
break;
case '\'': // NB: this does NOT check what's between single quotes
t = Character();
break;
case StreamTokenizer.TT_WORD:
if (Lexicon.IsVariable(st.SValue))
{
t = Variable(st.SValue);
break;
}
if (Lexicon.IsReservedWord(st.SValue))
{
t = Literal(st.SValue);
break;
}
if (Lexicon.IsIdKeyWord(st.SValue))
{
t = Literal(st.SValue);
t.AddAlternative(Identifier(st.SValue));
break;
}
t = Identifier(st.SValue);
break;
case '=': case '!': case '<': case '>':
case '&': case '|': case '+': case '-':
case '*': case '/': case '%':
if (nextChar == '=' ||
(tk == nextChar && (tk == '+' || tk == '-' || tk == '&' || tk == '|')))
{
t = Literal(((char)tk).ToString()+(char)nextChar);
st.SkipChar(true);
break;
}
goto default;
default:
t = Literal(tk);
break;
}
return t;
}
}
}