private Atom ReadAtom(IEnumerator <Lexem> state) { var lexem = state.Current; switch (lexem.Kind) { case LexemKind.TokenLexem: { var tokenLexem = (TokenLexem)lexem; switch (tokenLexem.TokenKind) { case LexemTokenKind.OpenBrace: var innerAtoms = ReadList(state, LexemFactory.CloseBrace).ToList(); if (!LexemFactory.CloseBrace.Equals(state.Current)) { throw new Exception("Unexpected " + state.Current); } state.MoveNext(); return(Cons.FromEnumerable(innerAtoms)); default: throw new Exception("Unexpected " + tokenLexem); } } default: throw new Exception("Unexpected " + lexem.Kind); } }