using System.Collections.Generic; namespace Ink { public partial class InkParser { // Handles both newline and endOfFile protected object EndOfLine() { return OneOf(Newline, EndOfFile); } // Allow whitespace before the actual newline protected object Newline() { Whitespace(); bool gotNewline = ParseNewline () != null; // Optional \r, definite \n to support Windows (\r\n) and Mac/Unix (\n) if( !gotNewline ) { return null; } else { return ParseSuccess; } } protected object EndOfFile() { Whitespace(); if (!endOfInput) return null; return ParseSuccess; } // General purpose space, returns N-count newlines (fails if no newlines) protected object MultilineWhitespace() { List<object> newlines = OneOrMore(Newline); if (newlines == null) return null; // Use content field of Token to say how many newlines there were // (in most circumstances it's unimportant) int numNewlines = newlines.Count; if (numNewlines >= 1) { return ParseSuccess; } else { return null; } } protected object Whitespace() { if( ParseCharactersFromCharSet(_inlineWhitespaceChars) != null ) { return ParseSuccess; } return null; } protected ParseRule Spaced(ParseRule rule) { return () => { Whitespace (); var result = ParseObject(rule); if (result == null) { return null; } Whitespace (); return result; }; } protected object AnyWhitespace () { bool anyWhitespace = false; while (OneOf (Whitespace, MultilineWhitespace) != null) { anyWhitespace = true; } return anyWhitespace ? ParseSuccess : null; } protected ParseRule MultiSpaced (ParseRule rule) { return () => { AnyWhitespace (); var result = ParseObject (rule); if (result == null) { return null; } AnyWhitespace (); return result; }; } private CharacterSet _inlineWhitespaceChars = new CharacterSet(" \t"); } }