Пример #1
0
        void SetArrayVariableValue(VariableNameToken variableNameToken, ValueTokenArray indicies, ValueToken value)
        {
            switch (variableNameToken.VariableType)
            {
            case VariableValueType.String:
                var stringValueToken = (StringValueToken)value;
                SetStringArrayVariableValue(variableNameToken, indicies, stringValueToken);
                break;

            case VariableValueType.RealNumber:
                if (value is IntegerValueToken integerValueToken)
                {
                    value = new RealValueToken(integerValueToken.RealValue);
                }

                SetRealNumberArrayVariableValue(variableNameToken, indicies, (RealValueToken)value);
                break;

            case VariableValueType.IntegerNumber:
                if (value is RealValueToken realValueToken)
                {
                    IntegerValueToken.CheckValueBounds(realValueToken.RealValue);
                    value = new IntegerValueToken((Int16)realValueToken.IntValue);
                }
                SetIntegerNumberArrayVariableValue(variableNameToken, indicies, (IntegerValueToken)value);
                break;
            }
        }
Пример #2
0
        public UserDefinedFunction GetUserDefinedFunction(VariableNameToken functionName)
        {
            UserDefinedFunction function = null;

            userDefinedFunctions.TryGetValue(functionName.Name, out function);
            return(function);
        }
Пример #3
0
        void SetStringArrayVariableValue(VariableNameToken variableNameToken, ValueTokenArray indicies, StringValueToken value)
        {
            if (stringVariableArray.TryGetValue(variableNameToken.Name, out var stringArray) == false)
            {
                stringArray = CreateStringArrayVariable(variableNameToken,
                                                        ConvertTokensArrayToIntArray(indicies, AdjustDimensionForUndimensionedCreate));
            }

            stringArray.SetValue(ConvertTokensArrayToIntArray(indicies), value);
        }
Пример #4
0
        void SetIntegerNumberArrayVariableValue(VariableNameToken variableNameToken, ValueTokenArray indicies, IntegerValueToken value)
        {
            if (integerVariableArray.TryGetValue(variableNameToken.Name, out var numberArray) == false)
            {
                numberArray = CreateIntegerNumberArrayVariable(variableNameToken,
                                                               ConvertTokensArrayToIntArray(indicies, AdjustDimensionForUndimensionedCreate));
            }

            numberArray.SetValue(ConvertTokensArrayToIntArray(indicies), value);
        }
Пример #5
0
        void SetStringValue(VariableNameToken nameToken, ValueToken valueToken)
        {
            if (valueToken is StringValueToken stringToken)
            {
                stringVariables[nameToken.Name] = stringToken;
                return;
            }

            throw new Exceptions.TypeMismatchException();
        }
Пример #6
0
 public void SetVariableValue(VariableNameToken variableNameToken, ValueTokenArray indicies, ValueToken value)
 {
     if (indicies == null)
     {
         SetVariableValue(variableNameToken, value);
     }
     else
     {
         SetArrayVariableValue(variableNameToken, indicies, value);
     }
 }
Пример #7
0
        public ForNextLoopState(StatementMarker startMarker, VariableNameToken _variableNameToken, NumericValueToken _startValue,
                                NumericValueToken _endValue, NumericValueToken _stepValue)
        {
            LoopMarker        = startMarker;
            VariableNameToken = _variableNameToken;
            StartValue        = _startValue;
            EndValue          = _endValue;
            StepValue         = _stepValue;
            CurrentValue      = StartValue;

            ImmediateModeStatementIndex = -1;
        }
Пример #8
0
        public ForNextLoopState(int _immediateModeStatementIndex, VariableNameToken _variableNameToken, NumericValueToken _startValue,
                                NumericValueToken _endValue, NumericValueToken _stepValue)
        {
            ImmediateModeStatementIndex = _immediateModeStatementIndex;
            VariableNameToken           = _variableNameToken;
            StartValue   = _startValue;
            EndValue     = _endValue;
            StepValue    = _stepValue;
            CurrentValue = StartValue;

            LoopMarker = null;
        }
Пример #9
0
        ArrayVariable <IntegerValueToken> CreateIntegerNumberArrayVariable(VariableNameToken variableNameToken, int[] dimensions)
        {
            if (integerVariableArray.TryGetValue(variableNameToken.Name, out ArrayVariable <IntegerValueToken> integerValueToken) == true)
            {
                throw new Exceptions.RedimException();
            }

            var integerValueArray = new ArrayVariable <IntegerValueToken>(variableNameToken, dimensions);

            integerVariableArray.Add(variableNameToken.Name, integerValueArray);

            return(integerValueArray);
        }
Пример #10
0
        ArrayVariable <StringValueToken> CreateStringArrayVariable(VariableNameToken variableNameToken, int[] dimensions)
        {
            if (stringVariableArray.TryGetValue(variableNameToken.Name, out ArrayVariable <StringValueToken> stringValueToken) == true)
            {
                throw new Exceptions.RedimException();
            }

            var stringArray = new ArrayVariable <StringValueToken>(variableNameToken, dimensions);

            stringVariableArray.Add(variableNameToken.Name, stringArray);

            return(stringArray);
        }
Пример #11
0
        ArrayVariable <RealValueToken> CreateRealNumberArrayVariable(VariableNameToken variableNameToken, int[] dimensions)
        {
            if (realNumberVariableArray.TryGetValue(variableNameToken.Name, out ArrayVariable <RealValueToken> realNumberValueToken) == true)
            {
                throw new Exceptions.RedimException();
            }

            var realValueArray = new ArrayVariable <RealValueToken>(variableNameToken, dimensions);

            realNumberVariableArray.Add(variableNameToken.Name, realValueArray);

            return(realValueArray);
        }
Пример #12
0
        IntegerValueToken GetIntegerVariableValue(VariableNameToken variableNameToken)
        {
            IntegerValueToken numberToken;

            integerVariables.TryGetValue(variableNameToken.Name, out numberToken);

            if (numberToken == null)
            {
                numberToken = interpreter.TokensProvider.CreateIntegerValueToken(0);
            }

            return(numberToken);
        }
Пример #13
0
        StringValueToken GetStringVariableValue(VariableNameToken variableNameToken)
        {
            StringValueToken stringToken;

            stringVariables.TryGetValue(variableNameToken.Name, out stringToken);

            // String variables that don't exist return an empty string token
            if (stringToken == null)
            {
                stringToken = interpreter.TokensProvider.CreateStringValueToken(string.Empty);
            }

            return(stringToken);
        }
Пример #14
0
        ValueToken GetIntegerArrayValue(VariableNameToken variableNameToken, ValueTokenArray indicies)
        {
            if (integerVariableArray.TryGetValue(variableNameToken.Name, out var numberArray) == false)
            {
                numberArray = CreateIntegerNumberArrayVariable(variableNameToken,
                                                               ConvertTokensArrayToIntArray(indicies, AdjustDimensionForUndimensionedCreate));
            }

            var result = numberArray.GetValue(ConvertTokensArrayToIntArray(indicies));

            if (result == null)
            {
                result = interpreter.TokensProvider.CreateIntegerValueToken(0);
            }

            return(result);
        }
Пример #15
0
        ValueToken GetStringArrayValue(VariableNameToken variableNameToken, ValueTokenArray indicies)
        {
            if (stringVariableArray.TryGetValue(variableNameToken.Name, out var stringArray) == false)
            {
                stringArray = CreateStringArrayVariable(variableNameToken,
                                                        ConvertTokensArrayToIntArray(indicies, AdjustDimensionForUndimensionedCreate));
            }

            var result = stringArray.GetValue(ConvertTokensArrayToIntArray(indicies));

            if (result == null)
            {
                result = interpreter.TokensProvider.CreateStringValueToken(string.Empty);
            }

            return(result);
        }
Пример #16
0
        public void SetVariableValue(VariableNameToken variableNameToken, ValueToken value)
        {
            switch (variableNameToken.VariableType)
            {
            case VariableValueType.String:
                SetStringValue(variableNameToken, value);
                break;

            case VariableValueType.RealNumber:
                SetRealNumberValue(variableNameToken, value);
                break;

            case VariableValueType.IntegerNumber:
                SetIntegerNumberValue(variableNameToken, value);
                break;
            }
        }
Пример #17
0
        void CreateArrayVariable(VariableNameToken variableNameToken, int[] dimensions)
        {
            switch (variableNameToken.VariableType)
            {
            case VariableValueType.String:
                CreateStringArrayVariable(variableNameToken, dimensions);
                break;

            case VariableValueType.RealNumber:
                CreateRealNumberArrayVariable(variableNameToken, dimensions);
                break;

            case VariableValueType.IntegerNumber:
                CreateIntegerNumberArrayVariable(variableNameToken, dimensions);
                break;
            }
        }
Пример #18
0
        public ValueToken GetArrayVariableValue(VariableNameToken variableNameToken, ValueTokenArray indicies)
        {
            switch (variableNameToken.VariableType)
            {
            case VariableValueType.String:
                return(GetStringArrayValue(variableNameToken, indicies));

            case VariableValueType.RealNumber:
                return(GetRealArrayValue(variableNameToken, indicies));

            case VariableValueType.IntegerNumber:
                return(GetIntegerArrayValue(variableNameToken, indicies));

            default:
                throw new NotImplementedException();
            }
        }
Пример #19
0
        public ValueToken GetVariableValue(VariableNameToken variableNameToken)
        {
            switch (variableNameToken.VariableType)
            {
            case VariableValueType.String:
                return(GetStringVariableValue(variableNameToken));

            case VariableValueType.RealNumber:
                return(GetRealNumberVariableValue(variableNameToken));

            case VariableValueType.IntegerNumber:
                return(GetIntegerVariableValue(variableNameToken));

            default:
                throw new NotImplementedException();
            }
        }
Пример #20
0
        void SetRealNumberValue(VariableNameToken nameToken, ValueToken valueToken)
        {
            if (valueToken is StringValueToken)
            {
                throw new Exceptions.TypeMismatchException();
            }

            var numberToken = (NumericValueToken)valueToken;

            if (numberToken is RealValueToken realToken)
            {
                realNumberVariables[nameToken.Name] = realToken;
            }
            else
            {
                realNumberVariables[nameToken.Name] = new RealValueToken(numberToken.RealValue);
            }
        }
Пример #21
0
        public VariableNameToken GetOrCreateVariableNameToken(string name, VariableValueType _variableType)
        {
#if false
            VariableNameToken token = null;
            var key = new ValueTuple <string, VariableValueType>(name, _variableType);

            if (variableNameTokens.TryGetValue(key, out token))
            {
                return(token);
            }
#endif

            var token = new VariableNameToken(name, _variableType);

#if false
            variableNameTokens.Add(key, token);
#endif
            return(token);
        }
Пример #22
0
        void SetIntegerNumberValue(VariableNameToken nameToken, ValueToken valueToken)
        {
            if (valueToken is StringValueToken)
            {
                throw new Exceptions.TypeMismatchException();
            }

            var numberToken = (NumericValueToken)valueToken;

            if (numberToken is IntegerValueToken integerToken)
            {
                integerVariables[nameToken.Name] = integerToken;
                return;
            }

            var realToken = (RealValueToken)valueToken;

            IntegerValueToken.CheckValueBounds(realToken.Value);

            integerVariables[nameToken.Name] = new IntegerValueToken((Int16)realToken.Value);
        }
Пример #23
0
        bool ProcessForNextState(Interpreter interpreter, ForNextLoopState forNextState, VariableNameToken variableNameToken = null)
        {
            // For NEXT with a variable name, check the variable name matches the one stored in the stack
//            if (variableNameToken != null && (forNextState.VariableNameToken.Name != variableNameToken.Name))
//                throw new Exceptions.NextWithoutForException();

            if (variableNameToken != null && (forNextState.VariableNameToken.Name != variableNameToken.Name))
            {
                /* Get Calendar from David Ahl's BASIC Computer Games to work without producing
                 * a NEXT WITHOUT FOR error. If the variable in NEXT [x] is not on top of the stack
                 * like it should be, then pop variables off the stack until a name match is found.
                 * If still no match, only then produce a NEXT WITHOUT FOR error. This supports the case
                 * where the program GOTOs out of an inner loop to an outer loop.
                 */
                interpreter.ForNextLoops.Pop();

                while (interpreter.ForNextLoops.Count > 0)
                {
                    forNextState = interpreter.ForNextLoops.Peek();
                    if (forNextState.VariableNameToken.Name == variableNameToken.Name)
                    {
                        break;
                    }

                    // Discard this loop and try matching the next one
                    interpreter.ForNextLoops.Pop();
                }

                if (interpreter.ForNextLoops.Count == 0)
                {
                    throw new Exceptions.NextWithoutForException();
                }
            }

            var newValue = forNextState.CurrentValue.RealValue + forNextState.StepValue.RealValue;

            bool forNextLoopIsDone = false;

            if (forNextState.StepValue.RealValue >= 0)
            {
                forNextLoopIsDone = (newValue > forNextState.EndValue.RealValue);
            }
            else
            {
                forNextLoopIsDone = (newValue < forNextState.EndValue.RealValue);
            }

            if (forNextLoopIsDone)
            {
                interpreter.ForNextLoops.Pop();
                return(true);
            }
#if false
            // If done, pop the stack and return true
            if (forNextState.StartValue.RealValue <= forNextState.EndValue.RealValue)
            {
                if (newValue > forNextState.EndValue.RealValue)
                {
                    interpreter.ForNextLoops.Pop();
                    return(true);
                }
            }
            else
            {
                var  endValue   = forNextState.EndValue.RealValue;
                bool isLessThan = (newValue < endValue);

                if (newValue > forNextState.EndValue.RealValue)
                {
                    interpreter.ForNextLoops.Pop();
                    return(true);
                }
            }
#endif
            // Keep going, set the NEXT variable and goto the first statement after the FOR
            forNextState.CurrentValue = interpreter.TokensProvider.CreateRealValueToken(newValue);
            interpreter.VariablesEnvironment.SetVariableValue(forNextState.VariableNameToken, forNextState.CurrentValue);

            if (forNextState.LoopMarker != null)
            {
                // If in immediate mode, there may be no valid statement to loop to.
                if (forNextState.LoopMarker.Valid)
                {
                    var forNextStatement = new StatementMarker(forNextState.LoopMarker);
                    interpreter.NextStatementMarker = forNextStatement;
                }
            }
            else
            {
                var index = forNextState.ImmediateModeStatementIndex;
                interpreter.CurrentImmediateModeStatementMarker.MoveTo(index);
            }

            // Not done
            return(false);
        }
Пример #24
0
 public UserDefinedFunction(VariableNameToken _variableNameToken, Statement _statement) : base("_", FunctionArgumentFlags.Number | FunctionArgumentFlags.Required)
 {
     variableNameToken   = _variableNameToken;
     statement           = _statement;
     expressionEvaluator = null;
 }
Пример #25
0
        bool AssignInputToVariable(Interpreter interpreter, VariableNameToken variableNameToken, ValueTokenArray indicies, string parsedInput)
        {
            switch (variableNameToken.VariableType)
            {
            case VariableValueType.String:
                StringValueToken stringValueToken;

                // Strip the quotes before setting the value to the variable.
                if (parsedInput.StartsWith('\"'))
                {
                    int endIndex = parsedInput.Length;
                    if (parsedInput[endIndex - 1] == '\"')
                    {
                        endIndex -= 1;
                    }
                    stringValueToken = interpreter.TokensProvider.CreateStringValueToken(parsedInput.Substring(1, endIndex - 1 - 1));
                }
                else
                {
                    stringValueToken = interpreter.TokensProvider.CreateStringValueToken(parsedInput);
                }

                interpreter.VariablesEnvironment.SetVariableValue(variableNameToken, indicies, stringValueToken);

                return(true);

            case VariableValueType.RealNumber:
                // If the string starts with a quote, it's an error.
                // ... even if what's in quotes can parse to a number
                if (parsedInput[0] == '\"')
                {
                    return(false);
                }

                // If the conversion fails, it's an error.
                if (float.TryParse(parsedInput, out float realValue) == false)
                {
                    return(false);
                }

                var realValueToken = interpreter.TokensProvider.CreateRealValueToken(realValue);
                interpreter.VariablesEnvironment.SetVariableValue(variableNameToken, indicies, realValueToken);

                break;

            case VariableValueType.IntegerNumber:
                // If the string starts with a quote, it's an error.
                // ... even if what's in quotes can parse to a number
                if (parsedInput[0] == '\"')
                {
                    return(false);
                }

                // If the conversion fails, it's an error.
                if (Int16.TryParse(parsedInput, out Int16 intValue) == false)
                {
                    return(false);
                }

                var intValueToken = interpreter.TokensProvider.CreateIntegerValueToken(intValue);
                interpreter.VariablesEnvironment.SetVariableValue(variableNameToken, indicies, intValueToken);
                break;
            }
            return(true);
        }
Пример #26
0
        public void DimensionArrayVariable(VariableNameToken variableNameToken, ValueTokenArray valueTokens)
        {
            var dimensions = ConvertTokensArrayToIntArray(valueTokens, 1);

            CreateArrayVariable(variableNameToken, dimensions);
        }
Пример #27
0
 public void CreateUserDefinedFunction(VariableNameToken functionName, UserDefinedFunction function)
 {
     // A second definition will happily replace any previous one.
     userDefinedFunctions[functionName.Name] = function;
 }