Пример #1
0
        public LispParseResult ParseUntilSourceLocation(string code, LispSourcePosition position)
        {
            var        sourceBindings   = new LispSourceBindings(Host.CurrentPackage);
            LispObject containingObject = null;
            var        eofValue         = new LispError("EOF");
            var        textReader       = new StringReader(code);
            var        textStream       = new LispTextStream("", textReader, TextWriter.Null);

            Host.ObjectReader.SetReaderStream(textStream);
            while (true)
            {
                var result = Host.ObjectReader.Read(false, eofValue, true);
                if (ReferenceEquals(result.LastResult, eofValue))
                {
                    break;
                }

                sourceBindings.TryAddSourceBinding(result.LastResult);

                if (result.LastResult.SourceLocation.HasValue &&
                    result.LastResult.SourceLocation.Value.ContainsPosition(position))
                {
                    containingObject = result.LastResult;
                    break;
                }
            }

            var narrowestChild = containingObject?.GetNarrowestChild(position);
            var parseResult    = new LispParseResult(Host, narrowestChild, sourceBindings);

            return(parseResult);
        }
Пример #2
0
 private LispExecutionState(LispStackFrame stackFrame, string inputName, TextReader codeReader, bool useTailCalls, bool allowHalting)
 {
     _operationQueue = new List <ILispEvaluatorOperation>();
     CodeInputStream = new LispTextStream(inputName, codeReader, TextWriter.Null);
     StackFrame      = stackFrame;
     UseTailCalls    = useTailCalls;
     AllowHalting    = allowHalting;
 }
Пример #3
0
        private LispObject Read(string text)
        {
            var host  = new LispHost();
            var input = new LispTextStream("", new StringReader(text), TextWriter.Null);

            host.ObjectReader.SetReaderStream(input);
            var result = host.ObjectReader.Read(false, new LispError("EOF"), false);

            return(result.LastResult);
        }
Пример #4
0
        public void IncompleteInputIsReturnedWhenReaderMacrosAreActive()
        {
            var text  = "\"this string is incomplete";
            var host  = new LispHost();
            var input = new LispTextStream("", new StringReader(text), TextWriter.Null);

            host.ObjectReader.SetReaderStream(input);
            var result = host.ObjectReader.Read(false, new LispError("EOF"), false);

            Assert.Equal(text, result.IncompleteInput);
        }
Пример #5
0
        public void ObjectsFromReaderMacrosHaveProperSourceSpansSet1()
        {
            var text  = "\"some string\"";
            var host  = new LispHost();
            var input = new LispTextStream("", new StringReader(text), TextWriter.Null);

            host.ObjectReader.SetReaderStream(input);
            var result = host.ObjectReader.Read(false, new LispError("EOF"), false);

            Assert.Equal(new LispSourceLocation("", new LispSourcePosition(1, 1), new LispSourcePosition(1, 14)), result.LastResult.SourceLocation);
        }
Пример #6
0
        public void PeekCharPeekTypeIsCharacter()
        {
            var input      = new StringReader(" ab ");
            var testStream = new LispTextStream("TEST-STREAM", input, TextWriter.Null);
            var host       = new LispHost();

            host.SetValue("TEST-STREAM", testStream);
            var result = host.Eval("(peek-char #\\b test-stream)").LastResult;

            Assert.Equal(new LispCharacter('b'), result);
        }
Пример #7
0
        public void ReadFunctionDefaultEofMarker()
        {
            var input      = new StringReader("14");
            var testStream = new LispTextStream("TEST-STREAM", input, TextWriter.Null);
            var host       = new LispHost();

            host.SetValue("TEST-STREAM", testStream);
            var result = host.Eval("(list (read test-stream) (read test-stream))").LastResult; // EOF propagates to the top

            Assert.Equal("EOF", ((LispError)result).Message);
        }
Пример #8
0
        public void ObjectsAfterReaderMacroHaveProperSourceSpansSet2()
        {
            var text  = "#'asdf 42";
            var host  = new LispHost();
            var input = new LispTextStream("", new StringReader(text), TextWriter.Null);

            host.ObjectReader.SetReaderStream(input);
            var _      = host.ObjectReader.Read(false, new LispError("EOF"), false); // swallow the string
            var result = host.ObjectReader.Read(false, new LispError("EOF"), false);

            Assert.Equal(new LispSourceLocation("", new LispSourcePosition(1, 8), new LispSourcePosition(1, 10)), result.LastResult.SourceLocation);
        }
Пример #9
0
        public void ObjectsFromReaderMacrosHaveProperSourceSpansSet2()
        {
            var text  = "#'asdf";
            var host  = new LispHost();
            var input = new LispTextStream("", new StringReader(text), TextWriter.Null);

            host.ObjectReader.SetReaderStream(input);
            var result = host.ObjectReader.Read(false, new LispError("EOF"), false);

            Assert.Equal("#'COMMON-LISP-USER:ASDF", result.LastResult.ToString());
            Assert.Equal(new LispSourceLocation("", new LispSourcePosition(1, 1), new LispSourcePosition(1, 7)), result.LastResult.SourceLocation);
        }
Пример #10
0
        public void ReadFunctionCustomEofMarker()
        {
            var input      = new StringReader("14");
            var testStream = new LispTextStream("TEST-STREAM", input, TextWriter.Null);
            var host       = new LispHost();

            host.SetValue("TEST-STREAM", testStream);
            var result     = host.Eval("(list (read test-stream) (read test-stream nil -54))").LastResult;
            var resultList = ((LispList)result).ToList();

            Assert.Equal(2, resultList.Count);
            Assert.Equal(14, ((LispInteger)resultList[0]).Value);
            Assert.Equal(-54, ((LispInteger)resultList[1]).Value);
        }
Пример #11
0
        public void PrintFunctionWithStream()
        {
            var output     = new StringWriter();
            var testStream = new LispTextStream("TEST-STREAM", TextReader.Null, output);
            var host       = new LispHost();

            host.SetValue("TEST-STREAM", testStream);
            var result = host.Eval(@"
(print ""abc"" test-stream)
").LastResult;

            Assert.Equal("abc", ((LispString)result).Value);
            Assert.Equal("\n\"abc\"\n \n", NormalizeNewlines(output.ToString()));
        }
Пример #12
0
        public void TerPriFunctionWithStream()
        {
            var output     = new StringWriter();
            var testStream = new LispTextStream("TEST-STREAM", TextReader.Null, output);
            var host       = new LispHost();

            host.SetValue("TEST-STREAM", testStream);
            var result = host.Eval(@"
(terpri test-stream)
").LastResult;

            Assert.True(result.IsNil());
            Assert.Equal("\n", NormalizeNewlines(output.ToString()));
        }
Пример #13
0
        public void ReadStreamObjectsThenCustomEofMarker()
        {
            var input  = new StringReader("14");
            var stream = new LispTextStream("TEST-STREAM", input, TextWriter.Null);
            var host   = new LispHost();

            host.ObjectReader.SetReaderStream(stream);

            var number = (LispInteger)host.ObjectReader.Read(false, new LispError("EOF"), false).LastResult;

            Assert.Equal(14, number.Value);

            var eof = (LispInteger)host.ObjectReader.Read(false, new LispInteger(-54), false).LastResult;

            Assert.Equal(-54, eof.Value);
        }
Пример #14
0
        public void FormatToStream()
        {
            var output     = new StringWriter();
            var testStream = new LispTextStream("TEST-STREAM", TextReader.Null, output);
            var host       = new LispHost();

            host.SetValue("TEST-STREAM", testStream);
            var result = host.Eval(@"
(format test-stream ""~S~%"" ""just a string"")
(format test-stream ""~S~%"" '(+ 2 3))
");

            Assert.IsNotType <LispError>(result);
            var actual = NormalizeNewlines(output.ToString());

            Assert.Equal("\"just a string\"\n(+ 2 3)\n", actual);
        }
Пример #15
0
        public void ReadStreamObjectsThenDefaultEofMarker()
        {
            var input  = new StringReader("(abc 2)\n14");
            var stream = new LispTextStream("TEST-STREAM", input, TextWriter.Null);
            var host   = new LispHost();

            host.ObjectReader.SetReaderStream(stream);

            var list = ((LispList)host.ObjectReader.Read(false, new LispError("EOF"), false).LastResult).ToList();

            Assert.Equal(2, list.Count);
            Assert.Equal("ABC", ((LispSymbol)list[0]).LocalName);
            Assert.Equal(2, ((LispInteger)list[1]).Value);

            var number = (LispInteger)host.ObjectReader.Read(false, new LispError("EOF"), false).LastResult;

            Assert.Equal(14, number.Value);

            var eof = (LispError)host.ObjectReader.Read(false, new LispError("EOF"), false).LastResult;

            Assert.Equal("EOF", eof.Message);
        }