public QilExpression Read()
{
_stk = new Stack<QilList>();
_inFwdDecls = false;
_scope = new Dictionary<string, QilNode>();
_fwdDecls = new Dictionary<string, QilNode>();
_stk.Push(_f.Sequence());
while (_r.Read())
{
switch (_r.NodeType)
{
case XmlNodeType.Element:
bool emptyElem = _r.IsEmptyElement;
// XmlReader does not give an event for empty elements, so synthesize one
if (StartElement() && emptyElem)
EndElement();
break;
case XmlNodeType.EndElement:
EndElement();
break;
case XmlNodeType.Whitespace:
case XmlNodeType.SignificantWhitespace:
case XmlNodeType.XmlDeclaration:
case XmlNodeType.Comment:
case XmlNodeType.ProcessingInstruction:
break;
default:
Debug.Fail("Unexpected event " + _r.NodeType + ", value " + _r.Value);
break;
}
}
Debug.Assert(_fwdDecls.Keys.Count == 0, "One or more forward declarations were never defined");
Debug.Assert(_stk.Peek()[0].NodeType == QilNodeType.QilExpression, "Serialized qil tree did not contain a QilExpression node");
return (QilExpression)_stk.Peek()[0];
}