Skip to content

Commit

Permalink
Add passing of user-defined args
Browse files Browse the repository at this point in the history
Allow expressions to be functions
Fix return value of functions to always be added to operation stack
Add array and len functions
  • Loading branch information
ethanmoffat committed Jan 30, 2022
1 parent ba0c693 commit 5cc0ffd
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 8 deletions.
20 changes: 18 additions & 2 deletions EOBot/ArgumentsParser.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.IO;
using EOBot.Interpreter.Variables;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace EOBot
Expand Down Expand Up @@ -36,6 +38,8 @@ public class ArgumentsParser
public string Password { get; private set; }
public string Character { get; private set; }

public List<string> UserArgs { get; internal set; }

public ArgumentsParser(string[] args)
{
InitDelay = 1100;
Expand All @@ -48,8 +52,20 @@ public ArgumentsParser(string[] args)
return;
}

foreach (var arg in args)
for (int i = 0; i < args.Length; i++)
{
var arg = args[i];

if (arg == "--")
{
UserArgs = new List<string>();
for (i = i + 1; i < args.Length; i++)
{
UserArgs.Add(args[i]);
}
break;
}

var pair = arg.ToLower().Split('=');

if (pair.Length != 2)
Expand Down
2 changes: 1 addition & 1 deletion EOBot/Interpreter/BotInterpreter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public void Run(ArgumentsParser parsedArgs, IReadOnlyList<BotToken> tokens)

ProgramState input = new ProgramState(tokens);
setup.SetupBuiltInFunctions(input);
setup.SetupBuiltInVariables(parsedArgs);
setup.SetupBuiltInVariables(input, parsedArgs);

if (!scriptEvaluator.Evaluate(input))
{
Expand Down
23 changes: 20 additions & 3 deletions EOBot/Interpreter/BuiltInIdentifierConfigurator.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,36 @@
using EOBot.Interpreter.States;
using EOBot.Interpreter.Variables;
using System.Collections.Generic;
using System.Linq;

namespace EOBot.Interpreter
{
public class BuiltInIdentifierConfigurator
{
public void SetupBuiltInFunctions(ProgramState input)
{
var function = new VoidFunctionRef<string>(PredefinedIdentifiers.PRINT_FUNC, param1 => ConsoleHelper.WriteMessage(ConsoleHelper.Type.None, param1));
input.SymbolTable[PredefinedIdentifiers.PRINT_FUNC] = function;
var printFunc = new VoidFunctionRef<object>(PredefinedIdentifiers.PRINT_FUNC, param1 => ConsoleHelper.WriteMessage(ConsoleHelper.Type.None, param1.ToString()));
input.SymbolTable[PredefinedIdentifiers.PRINT_FUNC] = printFunc;

var lenFunc = new FunctionRef<ArrayVariable, int>(PredefinedIdentifiers.LEN_FUNC, param1 => param1.Value.Count);
input.SymbolTable[PredefinedIdentifiers.LEN_FUNC] = lenFunc;

var arrayFunc = new FunctionRef<int, List<IVariable>>(PredefinedIdentifiers.ARRAY_FUNC,
param1 => Enumerable.Repeat(UndefinedVariable.Instance, param1).Cast<IVariable>().ToList());
input.SymbolTable.Add(PredefinedIdentifiers.ARRAY_FUNC, arrayFunc);
}

public void SetupBuiltInVariables(ArgumentsParser parsedArgs)
public void SetupBuiltInVariables(ProgramState input, ArgumentsParser parsedArgs)
{
input.SymbolTable[PredefinedIdentifiers.HOST] = new StringVariable(parsedArgs.Host);
input.SymbolTable[PredefinedIdentifiers.PORT] = new IntVariable(parsedArgs.Port);
input.SymbolTable[PredefinedIdentifiers.ARGS] = new ArrayVariable(
parsedArgs.UserArgs.Select(x => new StringVariable(x)).Cast<IVariable>().ToList());

input.SymbolTable[PredefinedIdentifiers.RESULT] = UndefinedVariable.Instance;
input.SymbolTable[PredefinedIdentifiers.ACCOUNT] = UndefinedVariable.Instance;
input.SymbolTable[PredefinedIdentifiers.CHARACTER] = UndefinedVariable.Instance;
input.SymbolTable[PredefinedIdentifiers.MAPSTATE] = UndefinedVariable.Instance;
}
}
}
4 changes: 4 additions & 0 deletions EOBot/Interpreter/States/ExpressionEvaluator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ public bool Evaluate(ProgramState input)
}
else
{
// an expression can be a function call
if (_evaluators.OfType<FunctionEvaluator>().Single().Evaluate(input))
return true;

if (!_evaluators.OfType<OperandEvaluator>().Single().Evaluate(input))
return false;

Expand Down
8 changes: 7 additions & 1 deletion EOBot/Interpreter/States/FunctionEvaluator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ private bool Call(ProgramState input, ICallable<int> function, params IVariable[
var result = function.Call(variables);
var varResult = new IntVariable(result);
input.SymbolTable[PredefinedIdentifiers.RESULT] = varResult;
input.OperationStack.Push(new VariableBotToken(BotTokenType.Variable, result.ToString(), varResult));
input.OperationStack.Push(new VariableBotToken(BotTokenType.Literal, varResult.StringValue, varResult));
}
catch (ArgumentException)
{
Expand All @@ -93,7 +93,9 @@ private bool Call(ProgramState input, ICallable<string> function, params IVariab
try
{
var result = function.Call(variables);
var varResult = new StringVariable(result);
input.SymbolTable[PredefinedIdentifiers.RESULT] = new StringVariable(result);
input.OperationStack.Push(new VariableBotToken(BotTokenType.Literal, varResult.StringValue, varResult));
}
catch (ArgumentException)
{
Expand All @@ -108,7 +110,9 @@ private bool Call(ProgramState input, ICallable<List<IVariable>> function, param
try
{
var result = function.Call(variables);
var varResult = new ArrayVariable(result);
input.SymbolTable[PredefinedIdentifiers.RESULT] = new ArrayVariable(result);
input.OperationStack.Push(new VariableBotToken(BotTokenType.Literal, varResult.StringValue, varResult));
}
catch (ArgumentException)
{
Expand All @@ -123,7 +127,9 @@ private bool Call(ProgramState input, ICallable<bool> function, params IVariable
try
{
var result = function.Call(variables);
var varResult = new BoolVariable(result);
input.SymbolTable[PredefinedIdentifiers.RESULT] = new BoolVariable(result);
input.OperationStack.Push(new VariableBotToken(BotTokenType.Literal, varResult.StringValue, varResult));
}
catch (ArgumentException)
{
Expand Down
18 changes: 18 additions & 0 deletions EOBot/Interpreter/Variables/PredefinedIdentifiers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,24 @@ public static class PredefinedIdentifiers
{
public const string RESULT = "result";

public const string HOST = "host";

public const string PORT = "port";

public const string PRINT_FUNC = "print";

public const string LEN_FUNC = "len";

public const string ARRAY_FUNC = "array";



public const string ACCOUNT = "account";

public const string CHARACTER = "character";

public const string MAPSTATE = "mapstate";

public const string ARGS = "args";
}
}
4 changes: 3 additions & 1 deletion EOBot/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,8 @@ static void ShowError(ArgumentsParser args)
" initDelay=<timeInMS>\n" +
" account=<account>\n" +
" password=<password>\n" +
" character=<character>\n");
" character=<character>\n" +
" [-- arg1, [arg2..argn]]");
Console.WriteLine("\t script: script file to execute");
Console.WriteLine("\t host: hostname or IP address");
Console.WriteLine("\t port: port to connect on (probably 8078)");
Expand All @@ -287,6 +288,7 @@ static void ShowError(ArgumentsParser args)
Console.WriteLine("\t account: Account to connect with (created if it does not exist)");
Console.WriteLine("\t password: Password");
Console.WriteLine("\t character: Character to use (created if it does not exist)");
Console.WriteLine("\t --: Any arguments passed after '--' will be available in a script under the '$args' array");
}
}
}

0 comments on commit 5cc0ffd

Please sign in to comment.