using KumiScript.Interpreter; namespace KumiScript.Reader { public class ParserQuoteVisitor : ITokenVisitor { Parser _parser; public ParserQuoteVisitor(Parser parser) { _parser = parser; } public Expression VisitAtom(AtomToken atom) { List quotedAtom = new List { new SymbolExpression(new Symbol("quote")), atom.ToExpression() }; return new ProperListExpression(quotedAtom); } public Expression VisitEoF(EndOfFileToken eof) { throw new ParserUnexpectedEndOfFileException("Expected , , got EOF."); } public Expression VisitParen(ParenthesisToken paren) { if (!paren._leftParen) throw new ParserUnexpectedTokenException("Unexpected Token ')'! Wanted , '('."); List list = new List(); ParserListVisitor listVisitor = new ParserListVisitor(_parser); Expression item = _parser.NextExpressionCC(listVisitor); while (item is not null) { list.Add(item); item = _parser.NextExpressionCC(listVisitor); } Expression listExpression = ListFactory.MakeList(list); List quotedList = new List { new SymbolExpression(new Symbol("quote")), listExpression }; return new ProperListExpression(quotedList); } public Expression VisitSpecial(SpecialToken spec) { throw new ParserUnexpectedTokenException("Expected , , got SPECIAL."); } public Expression VisitString(StringToken str) { List quotedString = new List { new SymbolExpression(new Symbol("quote")), str.ToExpression() }; return new ProperListExpression(quotedString); } } }