示例#1
0
		public override ExecuteResult Execute(Space space) {
			if (_variableExpresison.GetExpressionType() != ExpressionType.Variable) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.ExpressionDouble, "The expression isn't a type of variable!");
				return ExecuteResult.Failed;
			}
			if (!IsSuccess(_variableExpresison.Execute(space))) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.ExpressionDouble, "The expression execute failed!");
				return ExecuteResult.Failed;
			}
			var variable = (_variableExpresison as SentenceExpressionVariable).variable;
			var value = _variableExpresison.value;
			if (!ValueTool.IsNumber(value)) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.ExpressionDouble, "The value of variable isn't a type of 'number'!");
				return ExecuteResult.Failed;
			}
			var ret = _calculate.Calculate(value, new ValueNumber(1));
			if (!ret) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.ExpressionDouble, "The calculate is failed!");
				return ExecuteResult.Failed;
			}
			if (!variable.SetValue(ret)) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.ExpressionDouble, "The variable set value failed!");
				return ExecuteResult.Failed;
			}
			SetValue(_bLast ? value : ret);
			return ExecuteResult.Successed;
		}
		public Variable Execute(Space space) {
			if (!Sentence.IsSuccess(_header.Execute(space))) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableInsideAnalysis, "The header expression execute failed!");
				return null;
			}
			var headerValue = _header.value;
			if (!ValueTool.IsObject(headerValue)) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableInsideAnalysis, "The header expression isn't a object!");
				return null;
			}
			var tempValue = headerValue;
			Variable retVariable = null;
			foreach (var expression in _insides) {
				if (!ValueTool.IsObject(tempValue)) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableInsideAnalysis, "The expression isn't a object!");
					return null;
				}
				var objSpace = (tempValue as ValueObject).space;
				if (expression.GetExpressionType() != ExpressionType.Variable) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableInsideAnalysis, "The inside expression can't return a variable!");
					return null;
				}
				if (!Sentence.IsSuccess(expression.Execute(objSpace))) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableInsideAnalysis, "The inside expression execute failed!");
					return null;
				}
				retVariable = (expression as SentenceExpressionVariable).variable;
				tempValue = expression.value;
			}
			return retVariable;
		}
示例#3
0
		public override ExecuteResult Execute(Space space) {
			if (!Sentence.IsSuccess(_header.Execute(space))) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Inside, "The header expression execute failed!");
				return ExecuteResult.Failed;
			}
			var headerValue = _header.value;
			if (!ValueTool.IsObject(headerValue)) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Inside, "The header expression isn't a object!");
				return ExecuteResult.Failed;
			}
			var tempValue = headerValue;
			foreach (var expression in _insides) {
				if (!ValueTool.IsObject(tempValue)) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Inside, "The expression isn't a object!");
					return ExecuteResult.Failed;
				}
				var objSpace = (tempValue as ValueObject).space;
				if (!Sentence.IsSuccess(expression.Execute(objSpace))) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Inside, "The inside expression execute failed!");
					return ExecuteResult.Failed;
				}
				tempValue = expression.value;
			}
			SetValue(tempValue);
			return ExecuteResult.Successed;
		}
示例#4
0
		public override ExecuteResult Execute(Space space) {
			var tempSpace = new Space(SpaceType.Loop, space);
			while (true) {
				tempSpace.Clear();
				var ret = _sentence.Execute(tempSpace);
				if (!IsSuccess(ret)) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.DoWhile, "The sentence execute failed!");
					return ExecuteResult.Failed;
				}
				if (ret == ExecuteResult.Break) {
					break;
				}
				if (ret == ExecuteResult.Return) {
					SetReturnValue((_sentence as SentenceReturn).returnValue);
					tempSpace.Clear();
					return ExecuteResult.Return;
				}
				if (!IsSuccess(_expression.Execute(space))) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.DoWhile, "The condition expression execute failed!");
					return ExecuteResult.Failed;
				}
				if (!ValueTool.ToLogic(_expression.value)) {
					break;
				}
			}
			tempSpace.Clear();
			return ExecuteResult.Successed;
		}
示例#5
0
		public override ExecuteResult Execute(Space space) {
			if (!IsSuccess(_expression.Execute(space))) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Condition, "The condition expression execute failed!");
				return ExecuteResult.Failed;
			}
			bool bTrue = ValueTool.ToLogic(_expression.value);
			var tempSentence = bTrue ? _sentenceTrue : _sentenceFalse;
			if (tempSentence) {
				var tempSpace = new Space(SpaceType.Condition, space);
				var executeRet = tempSentence.Execute(tempSpace);
				if (!IsSuccess(executeRet)) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Condition, bTrue ? "The 'true' code sentence execute failed!" : "The 'false' code sentence execute failed!");
					return ExecuteResult.Failed;
				}
				if (executeRet == ExecuteResult.Return) {
					SetReturnValue((tempSentence as SentenceReturn).returnValue);
					return ExecuteResult.Return;
				}
				if (executeRet == ExecuteResult.Continue) {
					return ExecuteResult.Continue;
				}
				if (executeRet == ExecuteResult.Break) {
					return ExecuteResult.Break;
				}
				tempSpace.Clear();
			}
			
			return ExecuteResult.Successed;
		}
示例#6
0
		public override ExecuteResult Execute(Space space) {
			if (!IsSuccess(_expression.Execute(space))) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Echo, "The parameter expression execute failed!");
				return ExecuteResult.Failed;
			}
			var value = _expression.value;
			System0.Echo(ValueTool.ToString(value));

			return ExecuteResult.Successed;
		}
示例#7
0
		public override ExecuteResult Execute(Space space) {
			if (!IsSuccess(_expression.Execute(space))) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.ExpressionNot, "The [not-expression] execute failed!");
				return ExecuteResult.Failed;
			}

			var ret = ValueTool.ToLogic(_expression.value);
			SetValue(new ValueBool(!ret));

			return ExecuteResult.Successed;
		}
示例#8
0
		public override ExecuteResult Execute(Space space) {
			var tempSpace = new Space(SpaceType.Loop, space);
			if (_sentence0) {
				if (!IsSuccess(_sentence0.Execute(tempSpace))) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.For, "The 'sentence0' of 'for' execute failed!");
					return ExecuteResult.Failed;
				}
			}

			var contentSpace = new Space(SpaceType.Loop, tempSpace);
			while (true) {
				if (_expression0) {
					if (!IsSuccess(_expression0.Execute(tempSpace))) {
						ErrorLogger.LogRuntimeError(ErrorRuntimeCode.For, "The condition0-expression of 'for' execute failed!");
						return ExecuteResult.Failed;
					}
					if (!ValueTool.ToLogic(_expression0.value)) {
						break;
					}
				}
				if (_content) {
					contentSpace.Clear();
					var ret = _content.Execute(contentSpace);
					if (!IsSuccess(ret)) {
						ErrorLogger.LogRuntimeError(ErrorRuntimeCode.For, "The sentence of 'for' execute failed!");
						return ExecuteResult.Failed;
					}
					if (ret == ExecuteResult.Break) {
						break;
					}
					if (ret == ExecuteResult.Return) {
						SetReturnValue((_content as SentenceReturn).returnValue);
						tempSpace.Clear();
						return ExecuteResult.Return;
					}
				}
				if (_expression1) {
					if (!IsSuccess(_expression1.Execute(tempSpace))) {
						ErrorLogger.LogRuntimeError(ErrorRuntimeCode.For, "The condition1-expression of 'for' execute failed!");
						return ExecuteResult.Failed;
					}
				}
			}
			tempSpace.Clear();
			return ExecuteResult.Successed;
		}
示例#9
0
		public override ExecuteResult Execute(Space space) {
			if (!IsSuccess(_expression.Execute(space))) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Foreach, "The expression execute failed!");
				return ExecuteResult.Failed;
			}
			if (!ValueTool.IsArray(_expression.value)) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Foreach, "The expression isn't a array!");
				return ExecuteResult.Failed;
			}
			var arr = (_expression.value as ValueArray).value;
			if (arr.Count == 0) {
				return ExecuteResult.Successed;
			}

			var tempSpace = new Space(SpaceType.Loop, space);
			var itemVariable = new Variable(_name, VariableAttribute.None);
			if (!tempSpace.AddVariable(itemVariable)) {
				ErrorLogger.LogRuntimeError(_name);
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Foreach, "The variable \"" + _name + "\" execute failed!");
				return ExecuteResult.Failed;
			}
			var contentSpace = new Space(SpaceType.Loop, tempSpace);
			foreach (var item in arr) {
				itemVariable.SetValue(item.value);
				contentSpace.Clear();
				var ret = _sentence.Execute(contentSpace);
				if (!IsSuccess(ret)) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.Foreach, "The sentence execute failed!");
					return ExecuteResult.Failed;
				}
				if (ret == ExecuteResult.Break) {
					break;
				}
				if (ret == ExecuteResult.Return) {
					SetReturnValue((_sentence as SentenceReturn).returnValue);
					tempSpace.Clear();
					return ExecuteResult.Return;
				}
			}

			tempSpace.Clear();
			return ExecuteResult.Successed;
		}
		public Variable Execute(Space space) {
			if (!Sentence.IsSuccess(_valueExpression.Execute(space))) {
				ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableArrayItemAnalysis, "The expression execute failed!");
				return null;
			}
			var retValue = _valueExpression.value;
			Variable retVariable = null;

			var expressionVecSize = _indexExpressionVec.Count;
			for (var i = 0; i < expressionVecSize; ++i) {
				if (!ValueTool.IsArray(retValue)) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableArrayItemAnalysis, "The result of expression isn't a array!");
					return null;
				}
				var arr = (retValue as ValueArray).value;
				var expression = _indexExpressionVec[i];
				if (!Sentence.IsSuccess(expression.Execute(space))) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableArrayItemAnalysis, "The expression execute failed!");
					return null;
				}
				var indexValue = expression.value;
				if (!ValueTool.IsInteger(indexValue)) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableArrayItemAnalysis, "The index isn't a integer value!");
					return null;
				}
				var index = (int) ((indexValue as ValueNumber).value);
				if (index >= arr.Count) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableArrayItemAnalysis, "The index out of range!");
					return null;
				}
				retVariable = arr[index];
				if (!retVariable) {
					ErrorLogger.LogRuntimeError(ErrorRuntimeCode.VariableArrayItemAnalysis, "The array value is invalid!");
					return null;
				}
				retValue = retVariable.value;
			}

			return retVariable;
		}
示例#11
0
        private BuiltInFunction()
        {
            Action <string, int, Func <List <Value>, Space, Value> > _Emplace = (string name, int paramSize, Func <List <Value>, Space, Value> func) => {
                var value    = new ValueFunction(paramSize, func);
                var variable = new Variable(name, VariableAttribute.Const, value);
                variables.Add(name, variable);
            };

            // print
            _Emplace.Invoke("print", 1, (List <Value> args, Space s) => {
                string ret = "";
                foreach (var arg in args)
                {
                    ret += ValueTool.ToString(arg);
                }
                System0.Echo(ret);
                return(ValueNull.DEFAULT_VALUE);
            });
            // type
            _Emplace("type", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                return(new ValueString(ValueTool.ToTypeString(args[0])));
            });
            // is_null
            _Emplace("is_null", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                bool ret = true;
                foreach (var arg in args)
                {
                    ret &= ValueTool.IsNull(arg);
                }
                return(new ValueBool(ret));
            });
            // is_number
            _Emplace("is_number", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                bool ret = true;
                foreach (var arg in args)
                {
                    ret &= ValueTool.IsNumber(arg);
                }
                return(new ValueBool(ret));
            });
            // is_bool
            _Emplace("is_bool", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                bool ret = true;
                foreach (var arg in args)
                {
                    ret &= ValueTool.IsBool(arg);
                }
                return(new ValueBool(ret));
            });
            // is_string
            _Emplace("is_string", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                bool ret = true;
                foreach (var arg in args)
                {
                    ret &= ValueTool.IsString(arg);
                }
                return(new ValueBool(ret));
            });
            // is_array
            _Emplace("is_array", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                bool ret = true;
                foreach (var arg in args)
                {
                    ret &= ValueTool.IsArray(arg);
                }
                return(new ValueBool(ret));
            });
            // is_function
            _Emplace("is_function", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                bool ret = true;
                foreach (var arg in args)
                {
                    ret &= ValueTool.IsFunction(arg);
                }
                return(new ValueBool(ret));
            });
            // is_object
            _Emplace("is_object", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                bool ret = true;
                foreach (var arg in args)
                {
                    ret &= ValueTool.IsObject(arg);
                }
                return(new ValueBool(ret));
            });
            // len
            _Emplace("len", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                var value = args[0];
                if (ValueTool.IsArray(value))
                {
                    return(new ValueNumber((double)(value as ValueArray).value.Count));
                }
                else if (ValueTool.IsString(value))
                {
                    return(new ValueNumber((double)(value as ValueString).value.Length));
                }
                return(ValueNull.DEFAULT_VALUE);
            });
            // to_string
            _Emplace("to_string", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                var value = args[0];
                return(new ValueString(ValueTool.ToString(value)));
            });
            // to_number
            _Emplace("to_number", 1, (List <Value> args, Space s) => {
                if (args.Count == 0)
                {
                    return(null);
                }
                var value = args[0];
                if (!ValueTool.IsString(value))
                {
                    return(null);
                }
                double ret = 0;
                if (!double.TryParse((value as ValueString).value, out ret))
                {
                    ret = 0;
                }
                return(new ValueNumber(ret));
            });
        }
示例#12
0
		private static Sentence _ParseEnumDefine(string src, int size, int pos, out int nextPos) {
			nextPos = pos;
			if (!Grammar.MatchEnum(src, size, pos, out pos)) {
				return null;
			}
			if (!Jump(src, size, pos, out pos)) {
				return null;
			}
			string name;
			if (!Grammar.MatchName(src, size, pos, out pos, out name)) {
				return null;
			}
			Jump(src, size, pos, out pos);
			if (!Grammar.MatchObjectBegin(src, size, pos, out pos)) {
				return null;
			}
			var checkNameSet = new HashSet<string>();
			var checkValueSet = new HashSet<double>();
			var valueList = new LinkedList<KeyValuePair<string, ValueNumber>>();
			double indexValue = 0;
			while (true) {
				if (pos >= size) {
					return null;
				}
				Jump(src, size, pos, out pos);
				if (Grammar.MatchObjectEnd(src, size, pos, out pos)) {
					break;
				}
				string valueName = "";
				if (!Grammar.MatchName(src, size, pos, out pos, out valueName)) {
					return null;
				}
				Jump(src, size, pos, out pos);
				if (Grammar.MatchAssign(src, size, pos, out pos)) {
					Jump(src, size, pos, out pos);
					if (!Grammar.MatchNumber(src, size, pos, out pos, out indexValue)) {
						return null;
					}
					Jump(src, size, pos, out pos);
				}

				var valueNumber = new ValueNumber(indexValue);
				if (!ValueTool.IsInteger(valueNumber)) {
					return null;
				}

				if (checkNameSet.Contains(valueName)) {
					return null;
				}
				if (checkValueSet.Contains(indexValue)) {
					return null;
				}
				checkNameSet.Add(valueName);
				checkValueSet.Add(indexValue);
				valueList.AddLast(new KeyValuePair<string, ValueNumber>(valueName, valueNumber));

				Jump(src, size, pos, out pos);
				if (!Grammar.MatchSplitSymbol(src, size, pos, out pos)) {
					if (Grammar.MatchObjectEnd(src, size, pos, out pos)) {
						break;
					}
					return null;
				}

				indexValue += 1;
			}
			nextPos = pos;
			return new SentenceEnumDefine(name, valueList);
		}