/// <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); }
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(")"); }
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)); }