using System; using System.IO; using Ilog.Language.IO; using Ilog.Language.Parsing; public class CalculatorTokenizer : Tokenizer { TextReader reader; StreamTokenizer input; string file = "stdin"; public CalculatorTokenizer () { SetReader(Console.In); interactive = true; Banner(); Prompt(); } public CalculatorTokenizer (string stream, bool isFileName) { if (isFileName) { SetReader(new StreamReader(file = stream)); interactive = false; Banner(); Console.WriteLine("*** Parsing file: "+stream); } else { SetReader(new StringReader(stream)); interactive = false; } } public int LineNumber { get { return input.GetLineNumber(); } } public TextReader GetReader () { return reader; } public void SetReader (TextReader rd) { input = new StreamTokenizer(reader = rd); input.OrdinaryChars("+-/"); input.WordChars('_','_'); } private bool interactive; public bool IsInteractive { get { return interactive; } } private static string promptString = ">"; public static void Prompt () { Console.Write(promptString+" "); } static public void SetPrompt (string p) { promptString = p; } private static string banner = "*** Welcome to the number calculator! [C# version]\n" + "*** Generated on " + DateTime.Now.ToLongDateString() + ", at " + DateTime.Now.ToLongTimeString(); public static void Banner () { Console.WriteLine(banner); } private ParseNode Locate (ParseNode node) { return ((ParseNode)node.SetStart(input.TokenStart()).SetEnd(input.TokenEnd())) .SetFile(file); } public ParseNode NextToken() { ParseNode t = null; int token = input.NextToken(); switch (token) { case StreamTokenizer.TT_EOF: reader.Close(); t = GenericParser.E_O_I; break; case StreamTokenizer.TT_WORD: if (input.SValue == "exit") t = GenericParser.LiteralToken("exit"); else t = GenericParser.SymbolToken("IDENTIFIER",input.SValue); break; case StreamTokenizer.TT_NUMBER: t = GenericParser.NumberToken("NUMBER",input.NValue); break; default: char c = (char)token; t = GenericParser.LiteralToken(c.ToString()); break; } return Locate(t); } }