示例#1
0
        /// <summary>
        /// Evaluate a structure construction operation
        /// </summary>
        /// <param name="structureCons"></param>
        /// <param name="operands"></param>
        /// <returns></returns>
        private ValueStructureSparse EvaluateBasicPolyadicStructureConstructor(GMacStructureConstructor structureCons, OperandsByValueAccess operands)
        {
            ValueStructureSparse value;

            if (structureCons.HasDefaultValueSource)
            {
                value =
                    (ValueStructureSparse)structureCons
                    .DefaultValueSource
                    .AcceptVisitor(this)
                    .DuplicateValue(true);
            }

            else
            {
                value =
                    (ValueStructureSparse)GMacRootAst
                    .CreateDefaultValue(structureCons.Structure);
            }

            foreach (var command in operands.AssignmentsList)
            {
                var rhsValue = command.RhsExpression.AcceptVisitor(this);

                if (command.LhsValueAccess.IsFullAccess)
                {
                    value[command.LhsValueAccess.RootSymbol.ObjectName] = rhsValue.DuplicateValue(true);
                }

                else
                {
                    var sourceValue = value[command.LhsValueAccess.RootSymbol.ObjectName];

                    ValueAccessProcessor.WritePartialValue(sourceValue, command.LhsValueAccess, rhsValue.DuplicateValue(true));
                }
            }

            return(value);
        }
示例#2
0
        internal void Generate_BasicPolyadic_StructureConstruction(GMacStructureConstructor structureCons, OperandsByValueAccess operands)
        {
            Log.Append("{");

            if (structureCons.HasDefaultValueSource)
            {
                structureCons.DefaultValueSource.AcceptVisitor(this);
            }

            Log.Append("}");
            Log.Append("(");

            var flag = false;

            foreach (var operand in operands.AssignmentsList)
            {
                if (flag)
                {
                    Log.Append(", ");
                }
                else
                {
                    flag = true;
                }

                operand.LhsValueAccess.AcceptVisitor(this);

                Log.Append(" : ");

                Log.Append(operand.LhsValueAccess.ExpressionType.TypeSignature);

                Log.Append(" = ");

                operand.RhsExpression.AcceptVisitor(this);
            }

            Log.Append(")");
        }
示例#3
0
        private ILanguageExpression CompileStructureConstructor(GMacStructureConstructor structureCons, OperandsByValueAccess operands)
        {
            ILanguageExpressionAtomic compiledDefaultValueSource = null;

            if (structureCons.HasDefaultValueSource)
            {
                compiledDefaultValueSource =
                    (ILanguageExpressionAtomic)CompileExpression(structureCons.DefaultValueSource);
            }

            var compiledOperands = OperandsByValueAccess.Create();

            foreach (var command in operands.AssignmentsList)
            {
                var compiledLhsValue = CompileLhsValueAccess(command.LhsValueAccess);

                var compiledRhsExpr =
                    (ILanguageExpressionAtomic)CompileExpression(command.RhsExpression);

                compiledOperands.AddOperand(compiledLhsValue, compiledRhsExpr);
            }

            return(structureCons.Structure.CreateConstructorExpression(compiledDefaultValueSource, compiledOperands));
        }