void procToken(Token t) { switch (t.Type) { case Token.TokType.OPEN_TAG: Element e = new Element(); e.Name = t.Value; //m_tokStack.Push(t); m_eltStack.Push(e); break; case Token.TokType.CLOSE_TAG: List<Element> lst = new List<Element>(); Element top = m_eltStack.Peek(); string name = top.Name; while (name.CompareTo(t.Value) != 0) { lst.Add(m_eltStack.Pop()); top = m_eltStack.Peek(); name = top.Name; } top.Children.AddRange(lst); if(name.CompareTo("OFX") == 0) m_finished = true; break; case Token.TokType.TEXT: m_eltStack.Peek().appendText(t.Value); break; case Token.TokType.EOF: throw new ParserException(t, "Unexpected end of file"); } }
public Token getNextToken() { Token result = null; int i = m_input.Read(); while( (result == null)&& (i != -1)) { char c = Convert.ToChar(i); switch (m_state) { case State.Initial: result = procCharInitial(c); break; case State.OpenTag: result = procCharOpenTag(c); break; case State.ClosedTag: result = procCharClosedTag(c); break; } m_chPrevious = c; if(result == null) i = m_input.Read(); } if (i == -1) { result = new Token(Token.TokType.EOF, null, null, m_pos, m_line, m_col); } return result; }
Token procCharOpenTag(char c) { updatePosition(c); switch (c) { case '/': if (m_strBuffText.Length > 1) throw new ScannerException("Unexpected '/' character.", m_pos, m_line, m_col); else { m_strBuffText.Append(c); } break; case '<': throw new ScannerException("Unexpected '<' character.", m_pos, m_line, m_col); break; case '>': m_strBuffText.Append(c); m_state = State.ClosedTag; Token.TokType type = Token.TokType.OPEN_TAG; string text = m_strBuffText.ToString(); if (text[1] == '/') type = Token.TokType.CLOSE_TAG; Token t = new Token(type, text, m_strBuffValue.ToString(), m_posStart, m_lineStart, m_colStart); m_strBuffText = new StringBuilder(); m_strBuffValue = new StringBuilder(); setTokBegin(); return t; default: m_strBuffText.Append(c); m_strBuffValue.Append(c); break; } return null; }
Token procCharClosedTag(char c) { Token result = null; updatePosition(c); switch (c) { case '<': string text = m_strBuffText.ToString(); if (text.Length > 0) { result = new Token(Token.TokType.TEXT, m_strBuffText.ToString(), m_strBuffText.ToString(), m_posStart, m_lineStart, m_colStart); } m_strBuffText = new StringBuilder(); m_strBuffText.Append(c); m_strBuffValue = new StringBuilder(); m_state = State.OpenTag; setTokBegin(); break; case '>': throw new ScannerException(m_pos, m_line, m_col); default: m_strBuffText.Append(c); break; } return result; }
public ParserException(Token t, string message) : base(message, t.Pos, t.Line, t.Col) { }