// // Parses the string @input and returns a CSharpParser if succeeful. // // if @silent is set to true then no errors are // reported to the user. This is used to do various calls to the // parser and check if the expression is parsable. // // @partial_input: if @silent is true, then it returns whether the // parsed expression was partial, and more data is needed // static CSharpParser ParseString(bool silent, string input, out bool partial_input) { partial_input = false; Reset(); queued_fields.Clear(); Stream s = new MemoryStream(Encoding.Default.GetBytes(input)); SeekableStreamReader seekable = new SeekableStreamReader(s, Encoding.Default); InputKind kind = ToplevelOrStatement(seekable); if (kind == InputKind.Error) { if (!silent) { Report.Error(-25, "Detection Parsing Error"); } partial_input = false; return(null); } if (kind == InputKind.EOF) { if (silent == false) { Console.Error.WriteLine("Internal error: EOF condition should have been detected in a previous call with silent=true"); } partial_input = true; return(null); } seekable.Position = 0; CSharpParser parser = new CSharpParser(seekable, (CompilationUnit)Location.SourceFiles [0]); parser.ErrorOutput = Report.Stderr; if (kind == InputKind.StatementOrExpression) { parser.Lexer.putback_char = Tokenizer.EvalStatementParserCharacter; RootContext.StatementMode = true; } else { // // Do not activate EvalCompilationUnitParserCharacter until // I have figured out all the limitations to invoke methods // in the generated classes. See repl.txt // parser.Lexer.putback_char = Tokenizer.EvalUsingDeclarationsParserCharacter; //parser.Lexer.putback_char = Tokenizer.EvalCompilationUnitParserCharacter; RootContext.StatementMode = false; } if (silent) { Report.DisableReporting(); } try { parser.parse(); } finally { if (Report.Errors != 0) { if (silent && parser.UnexpectedEOF) { partial_input = true; } parser.undo.ExecuteUndo(); parser = null; } if (silent) { Report.EnableReporting(); } } return(parser); }