mirror of
https://github.com/Ratstail91/Mementos.git
synced 2025-11-29 02:24:28 +11:00
130 lines
3.4 KiB
C#
130 lines
3.4 KiB
C#
|
|
namespace Ink
|
|
{
|
|
public partial class InkParser
|
|
{
|
|
// Valid returned objects:
|
|
// - "help"
|
|
// - int: for choice number
|
|
// - Parsed.Divert
|
|
// - Variable declaration/assignment
|
|
// - Epression
|
|
// - Lookup debug source for character offset
|
|
// - Lookup debug source for runtime path
|
|
public CommandLineInput CommandLineUserInput()
|
|
{
|
|
CommandLineInput result = new CommandLineInput ();
|
|
|
|
Whitespace ();
|
|
|
|
if (ParseString ("help") != null) {
|
|
result.isHelp = true;
|
|
return result;
|
|
}
|
|
|
|
if (ParseString ("exit") != null || ParseString ("quit") != null) {
|
|
result.isExit = true;
|
|
return result;
|
|
}
|
|
|
|
return (CommandLineInput) OneOf (
|
|
DebugSource,
|
|
DebugPathLookup,
|
|
UserChoiceNumber,
|
|
UserImmediateModeStatement
|
|
);
|
|
}
|
|
|
|
CommandLineInput DebugSource ()
|
|
{
|
|
Whitespace ();
|
|
|
|
if (ParseString ("DebugSource") == null)
|
|
return null;
|
|
|
|
Whitespace ();
|
|
|
|
var expectMsg = "character offset in parentheses, e.g. DebugSource(5)";
|
|
if (Expect (String ("("), expectMsg) == null)
|
|
return null;
|
|
|
|
Whitespace ();
|
|
|
|
int? characterOffset = ParseInt ();
|
|
if (characterOffset == null) {
|
|
Error (expectMsg);
|
|
return null;
|
|
}
|
|
|
|
Whitespace ();
|
|
|
|
Expect (String (")"), "closing parenthesis");
|
|
|
|
var inputStruct = new CommandLineInput ();
|
|
inputStruct.debugSource = characterOffset;
|
|
return inputStruct;
|
|
}
|
|
|
|
CommandLineInput DebugPathLookup ()
|
|
{
|
|
Whitespace ();
|
|
|
|
if (ParseString ("DebugPath") == null)
|
|
return null;
|
|
|
|
if (Whitespace () == null)
|
|
return null;
|
|
|
|
var pathStr = Expect (RuntimePath, "path") as string;
|
|
|
|
var inputStruct = new CommandLineInput ();
|
|
inputStruct.debugPathLookup = pathStr;
|
|
return inputStruct;
|
|
}
|
|
|
|
string RuntimePath ()
|
|
{
|
|
if (_runtimePathCharacterSet == null) {
|
|
_runtimePathCharacterSet = new CharacterSet (identifierCharSet);
|
|
_runtimePathCharacterSet.Add ('-'); // for c-0, g-0 etc
|
|
_runtimePathCharacterSet.Add ('.');
|
|
|
|
}
|
|
|
|
return ParseCharactersFromCharSet (_runtimePathCharacterSet);
|
|
}
|
|
|
|
CommandLineInput UserChoiceNumber()
|
|
{
|
|
Whitespace ();
|
|
|
|
int? number = ParseInt ();
|
|
if (number == null) {
|
|
return null;
|
|
}
|
|
|
|
Whitespace ();
|
|
|
|
if (Parse(EndOfLine) == null) {
|
|
return null;
|
|
}
|
|
|
|
var inputStruct = new CommandLineInput ();
|
|
inputStruct.choiceInput = number;
|
|
return inputStruct;
|
|
}
|
|
|
|
CommandLineInput UserImmediateModeStatement()
|
|
{
|
|
var statement = OneOf (SingleDivert, TempDeclarationOrAssignment, Expression);
|
|
|
|
var inputStruct = new CommandLineInput ();
|
|
inputStruct.userImmediateModeStatement = statement;
|
|
return inputStruct;
|
|
}
|
|
|
|
CharacterSet _runtimePathCharacterSet;
|
|
}
|
|
}
|
|
|