private ILanguageExpressionAtomic CompileRhsValueAccess(LanguageValueAccess valueAccess) { var compiledRootSymbol = valueAccess.RootSymbol; //Replace a reference to a constant by its value var namedValue = compiledRootSymbol as SymbolNamedValue; if (namedValue != null) { var compiledFullValue = namedValue.AssociatedValue; return (valueAccess.IsFullAccess ? compiledFullValue.DuplicateValue(true) : ValueAccessProcessor.ReadPartialValue(compiledFullValue, valueAccess).DuplicateValue(true)); } if (compiledRootSymbol is SymbolLocalVariable || compiledRootSymbol is SymbolProcedureParameter) { compiledRootSymbol = GetSymbolData((SymbolDataStore)compiledRootSymbol); } var compiledValueAccess = LanguageValueAccess.Create(compiledRootSymbol); if (valueAccess.IsPartialAccess) { //Note: This will not be correct for components of class ValueAccessStepBySymbol //because the component symbol must be compiled too. But GMac doesn't use these components anyway compiledValueAccess.Append(valueAccess.PartialAccessSteps); } return(compiledValueAccess); }
/// <summary> /// Read the value associated with a value access process /// </summary> /// <param name="valueAccess"></param> /// <returns></returns> public virtual ILanguageValue Visit(LanguageValueAccess valueAccess) { var value = ReadSymbolFullValue(valueAccess.RootSymbol); return (valueAccess.IsFullAccess ? value : ValueAccessProcessor.ReadPartialValue(value, valueAccess)); }
/// <summary> /// Update the full or partial value of a symbol (if allowed) depending on the given value access /// </summary> /// <param name="valueAccess"></param> /// <param name="value"></param> protected virtual void UpdateSymbolValue(LanguageValueAccess valueAccess, ILanguageValue value) { var symbol = valueAccess.RootSymbol; if (AllowUpdateSymbolValue(symbol) == false) { throw new InvalidOperationException("Invalid symbol type"); } if (valueAccess.IsFullAccess) { SetSymbolData((SymbolDataStore)symbol, value); return; } var sourceValue = ReadSymbolFullValue(symbol); ValueAccessProcessor.WritePartialValue(sourceValue, valueAccess, value); }
/// <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); }