2 // Author: Sergey Chaban (serge@wildwestsoftware.com)
7 using System
.Collections
;
14 public class ILReader
{
16 private StreamReader reader
;
17 private Stack putback_stack
;
18 private Location location
;
19 private Location markedLocation
;
21 public ILReader (StreamReader reader
)
24 putback_stack
= new Stack ();
26 location
= new Location ();
27 markedLocation
= Location
.Unknown
;
34 public Location Location
{
42 /// Provides access to underlying StreamReader.
44 public StreamReader BaseReader
{
52 if (putback_stack
.Count
> 0)
53 return (char) putback_stack
.Pop ();
55 return reader
.Read ();
60 if (putback_stack
.Count
> 0)
61 return (char) putback_stack
.Peek ();
63 return reader
.Peek ();
68 /// <returns></returns>
75 location
.NextColumn ();
81 /// <returns></returns>
90 public void Unread (char c
)
92 putback_stack
.Push (c
);
95 location
.PreviousLine ();
97 location
.PreviousColumn ();
103 /// <param name="chars"></param>
104 public void Unread (char [] chars
)
106 for (int i
=chars
.Length
-1; i
>=0; i
--)
112 /// <param name="c"></param>
113 public void Unread (int c
)
121 public void SkipWhitespace ()
124 for (; ch
!= -1 && Char
.IsWhiteSpace((char) ch
); ch
= Read ());
125 if (ch
!= -1) Unread (ch
);
131 /// <returns></returns>
132 public string ReadToWhitespace ()
134 StringBuilder sb
= new StringBuilder ();
136 for (; ch
!= -1 && !Char
.IsWhiteSpace((char) ch
); sb
.Append ((char) ch
), ch
= Read ());
137 if (ch
!= -1) Unread (ch
);
138 return sb
.ToString ();
144 public void MarkLocation ()
146 if (markedLocation
== Location
.Unknown
) {
147 markedLocation
= new Location (location
);
149 markedLocation
.CopyFrom (location
);
156 public void RestoreLocation ()
158 if (markedLocation
!= Location
.Unknown
) {
159 location
.CopyFrom (markedLocation
);