示例#1
0
        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);
        }
示例#2
0
        /// <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));
        }
示例#3
0
        /// <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);
        }
示例#4
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);
        }