public Token[] parse() { if (stack.Length < 1) { throw new InvalidOperationException("input sequence empty"); } result = new List <Token>(); do { string cur = peek(); if (Is.Whitespace(cur)) { if (digest() == "\n") { __line++; __col = 0; } } else if (Is.Comment(cur)) { string start = digest(); string close = "\n"; if (peek() == "/") { close = "/#"; } string s = digest(); do { s = digest(); if (close == "/#" && s == "/" && peek() == "#") { peek(); digest(); break; } else if (s == close) { break; } } while (!endOfStack()); } else if (Is.Structure(cur)) { addToken(readStructure(), ValueType.Struqture, __line, __col); } else if (Is.Operator(cur)) { addToken(readOperator(), ValueType.Operator, __line, __col); } else if (Is.String(cur)) { addToken(readString(), ValueType.String, __line, __col); } else if (Is.Number(cur)) { addToken(readNumber(), ValueType.Number, __line, __col); } else if (Is.Identifier(cur)) { addToken(readIdentifier(), ValueType.Identifier, __line, __col); } else { throw new Exception("unreadable symbol " + cur); } } while (!endOfStack()); return(result.ToArray()); }