using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Turtle { public class Parser : IDisposable { public string Path { get; private set; } public FileStream Stream { get; private set; } public Parser(string path) { Path = path; Stream = File.OpenRead(path); } public void Dispose() { Stream.Close(); Stream.Dispose(); } public Token FetchToken() { int c; while ((c = Stream.ReadByte()) != -1) { // string if (c >= (int)'a' && c <= (int)'z') { StringBuilder s = new StringBuilder(Convert.ToString(Convert.ToChar(c))); while ((c = Stream.ReadByte()) != -1) { if (c >= (int)'a' && c <= (int)'z') { s.Append(Convert.ToChar(c)); } else { break; } } Stream.Seek(-1, SeekOrigin.Current); string str = s.ToString(); return new Token(TokenType.String, str); } // number else if ((c >= (int)'0' && c <= (int)'9') || c == (int)'-') { StringBuilder s = new StringBuilder(Convert.ToString(Convert.ToChar(c))); while ((c = Stream.ReadByte()) != -1) { if (c >= (int)'0' && c <= (int)'9') { s.Append(Convert.ToChar(c)); } else { break; } } Stream.Seek(-1, SeekOrigin.Current); return new Token(TokenType.Number, Convert.ToInt32(s.ToString())); } // brackets else if (c == (int)'(') { return new Token(TokenType.LeftBracket); } else if (c == (int)')') { return new Token(TokenType.RightBracket); } } return null; // end of file } } }