コード例 #1
0
 public virtual void EvaluateUserTerm(ForthState state)
 {
     foreach (var definition in state.Mapping[Term])
     {
         definition.Evaluate(state);
     }
 }
コード例 #2
0
 public override void EvaluateDefaultTerm(ForthState state)
 {
     if (!state.Mapping.ContainsKey(Term))
     {
         throw new InvalidOperationException();
     }
 }
コード例 #3
0
 public override void EvaluateDefaultTerm(ForthState state)
 {
     if (!state.Mapping.ContainsKey(Term))
     {
         throw new ForthException(ForthError.UnknownWord);
     }
 }
コード例 #4
0
    private ForthState()
    {
        if (_instance != null)
        {
            return;
        }

        _instance = this;
    }
コード例 #5
0
 public override void Evaluate(ForthState state)
 {
     if (IsUserTerm(state))
     {
         EvaluateUserTerm(state);
     }
     else
     {
         EvaluateDefaultTerm(state);
     }
 }
コード例 #6
0
    public override void Evaluate(ForthState state)
    {
        int result;

        if (int.TryParse(term, out result))
        {
            throw new ForthException(ForthError.InvalidWord);
        }

        state.Mapping[term] = actions;
    }
コード例 #7
0
    public static string Eval(string input)
    {
        var expression = Expression.Parse(input);
        var state      = new ForthState();

        foreach (var definition in expression)
        {
            definition.Evaluate(state);
        }

        return(state.ToString());
    }
コード例 #8
0
    public override void EvaluateDefaultTerm(ForthState state)
    {
        if (state.Stack.Count < 1)
        {
            throw new InvalidOperationException();
        }

        var operand = state.Stack.Pop();

        foreach (var value in operation(operand))
        {
            state.Stack.Push(value);
        }
    }
コード例 #9
0
    public override void EvaluateDefaultTerm(ForthState state)
    {
        if (state.Stack.Count <= 1)
        {
            throw new ForthException(ForthError.StackUnderflow);
        }

        var operand2 = state.Stack.Pop();
        var operand1 = state.Stack.Pop();

        foreach (var value in operation(operand1, operand2))
        {
            state.Stack.Push(value);
        }
    }
コード例 #10
0
    public static string Evaluate(string[] instructions)
    {
        var state = new ForthState();

        foreach (var instruction in instructions)
        {
            var expression = Expression.Parse(instruction);

            foreach (var definition in expression)
            {
                definition.Evaluate(state);
            }
        }

        return(state.ToString());
    }
コード例 #11
0
    public override void Evaluate(ForthState state)
    {
        if (int.TryParse(term, out _))
        {
            throw new InvalidOperationException();
        }

        var normalizedActions = new List <ForthDefinition>();

        foreach (var action in actions)
        {
            if (action is Word word)
            {
                normalizedActions.AddRange(state.Mapping[word.Term]);
            }
            else
            {
                normalizedActions.Add(action);
            }
        }

        state.Mapping[term] = normalizedActions;
    }
コード例 #12
0
 public abstract void EvaluateDefaultTerm(ForthState state);
コード例 #13
0
 private bool IsUserTerm(ForthState state) => state.Mapping.ContainsKey(Term);
コード例 #14
0
 public abstract void Evaluate(ForthState state);
コード例 #15
0
 public override void Evaluate(ForthState state) => state.Stack.Push(n);