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); }
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; }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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())); }
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())); }
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); }
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); }
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); }