예제 #1
0
        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);
            }
        }