Files
Mementos/Unity/Alternate Genre Jam/Assets/Ink/InkLibs/InkCompiler/InkParser/InkParser_Whitespace.cs
2021-06-30 21:39:19 +10:00

113 lines
2.5 KiB
C#

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