示例#1
0
        private void VerifyOperation_Times()
        {
            if (Operand1Type.IsNumber() && Operand2Type.IsNumber())
            {
                ForceAtomicScalarOperands(ScalarType);
            }

            else if (Operand1Type.IsFrameMultivector() && Operand2Type.IsNumber())
            {
                _resultType = Operand1Type;

                _atomicOperand1 = Context.ActiveParentCommandBlock.ExpressionToMultivectorAtomicExpression(OperandsMultivectorType, _operand1);

                _atomicOperand2 = Context.ActiveParentCommandBlock.ExpressionToScalarAtomicExpression(_operand2);
            }

            else if (Operand1Type.IsNumber() && Operand2Type.IsFrameMultivector())
            {
                _resultType = Operand2Type;

                _atomicOperand1 = Context.ActiveParentCommandBlock.ExpressionToScalarAtomicExpression(_operand1);

                _atomicOperand2 = Context.ActiveParentCommandBlock.ExpressionToMultivectorAtomicExpression(OperandsMultivectorType, _operand2);
            }

            else
            {
                Context.CreateTypeMismatch("cannot apply Times to expressions of type " + Operand1TypeSignature + " and " + Operand2TypeSignature);
            }
        }
示例#2
0
        private void ForceAtomicMultivectorOperands(ILanguageType resultType)
        {
            _resultType = resultType;

            _atomicOperand1 = Context.ActiveParentCommandBlock.ExpressionToMultivectorAtomicExpression(OperandsMultivectorType, _operand1);

            _atomicOperand2 = ReferenceEquals(_operand2, null) ? null : Context.ActiveParentCommandBlock.ExpressionToMultivectorAtomicExpression(OperandsMultivectorType, _operand2);
        }
示例#3
0
 internal BasicPolyadic CreateConstructorExpression(ILanguageExpressionAtomic defaultValueSource)
 {
     return
         (BasicPolyadic.Create(
              this,
              GMacStructureConstructor.Create(this, defaultValueSource)
              ));
 }
示例#4
0
 internal static GMacStructureConstructor Create(GMacStructure structure, ILanguageExpressionAtomic defaultValueSource)
 {
     return
         (new GMacStructureConstructor(structure)
     {
         DefaultValueSource = defaultValueSource
     });
 }
        internal void SetDefaultValueSource(ILanguageExpressionAtomic defaultValueSource)
        {
            if (!defaultValueSource.ExpressionType.IsSameType(MultivectorType))
            {
                throw new InvalidOperationException("Default value source must be of type " + MultivectorType.TypeSignature);
            }

            DefaultValueSource = defaultValueSource;
        }
示例#6
0
 internal BasicPolyadic CreateConstructorExpression(ILanguageExpressionAtomic defaultValueSource, OperandsByValueAccess operands)
 {
     return
         (BasicPolyadic.Create(
              this,
              GMacStructureConstructor.Create(this, defaultValueSource),
              operands
              ));
 }
示例#7
0
 internal BasicPolyadic CreateConstructorExpression(ILanguageExpressionAtomic defaultValueSource, OperandsByIndex operands)
 {
     return
         (BasicPolyadic.Create(
              this,
              GMacFrameMultivectorConstructor.Create(this, defaultValueSource),
              operands
              ));
 }
        public ILanguageExpressionAtomic ReplaceLValueByExpression(ILanguageExpressionAtomic oldExpr, SymbolLValue oldLvalue, ILanguageExpressionAtomic newExpr)
        {
            var expr = oldExpr as LanguageValueAccess;

            return
                (expr == null ?
                 oldExpr :
                 ReplaceLValueByExpression(expr, oldLvalue, newExpr));
        }
示例#9
0
 public void ChangeOperand2(ILanguageExpressionAtomic operand)
 {
     if (operand.ExpressionType.IsSameType(Operand2.ExpressionType))
     {
         Operand2 = operand;
     }
     else
     {
         throw new InvalidOperationException();
     }
 }
示例#10
0
 public void ChangeOperand(string opName, ILanguageExpressionAtomic opExpr)
 {
     if (OperandsDictionary[opName].ExpressionType.IsSameType(opExpr.ExpressionType))
     {
         OperandsDictionary[opName] = opExpr;
     }
     else
     {
         throw new InvalidOperationException();
     }
 }
 public void ChangeRhsExpression(ILanguageExpressionAtomic rhsExpr)
 {
     if (rhsExpr.ExpressionType.IsSameType(RhsExpression.ExpressionType))
     {
         RhsExpression = rhsExpr;
     }
     else
     {
         throw new InvalidOperationException();
     }
 }
示例#12
0
 public void ChangeOperand(int opIndex, ILanguageExpressionAtomic opExpr)
 {
     if (Operands[opIndex].ExpressionType.IsSameType(opExpr.ExpressionType))
     {
         Operands[opIndex] = opExpr;
     }
     else
     {
         throw new InvalidOperationException();
     }
 }
示例#13
0
        private ILanguageExpression CompileMultivectorConstructor(GMacFrameMultivectorConstructor mvTypeCons, OperandsByIndex operands)
        {
            ILanguageExpressionAtomic compiledDefaultValueSource = null;

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

            var compiledOperands = OperandsByIndex.Create();

            foreach (var pair in operands.OperandsDictionary)
            {
                var compiledRhsExpr =
                    (ILanguageExpressionAtomic)CompileExpression(pair.Value);

                compiledOperands.AddOperand(pair.Key, compiledRhsExpr);
            }

            return(mvTypeCons.MultivectorType.CreateConstructorExpression(compiledDefaultValueSource, compiledOperands));
        }
示例#14
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));
        }
 public OperandsByValueAccessAssignment(LanguageValueAccess lhsValue, ILanguageExpressionAtomic rhsExpr)
 {
     LhsValueAccess = lhsValue;
     RhsExpression  = rhsExpr;
 }
示例#16
0
 internal GMacStructureConstructor CreateConstructorOperator(ILanguageExpressionAtomic defaultValueSource)
 {
     return(GMacStructureConstructor.Create(this, defaultValueSource));
 }
 internal static GMacFrameMultivectorConstructor Create(GMacFrameMultivector mvType, ILanguageExpressionAtomic defaultValueSource)
 {
     return(new GMacFrameMultivectorConstructor(mvType)
     {
         DefaultValueSource = defaultValueSource
     });
 }
示例#18
0
        public OperandsByName ReplaceLValueByExpression(OperandsByName oldOperands, SymbolLValue oldLvalue, ILanguageExpressionAtomic newExpr)
        {
            var newOperands = new Dictionary <string, ILanguageExpressionAtomic>();

            foreach (var pair in oldOperands.OperandsDictionary)
            {
                var newOpExpr = ReplaceLValueByExpression(pair.Value, oldLvalue, newExpr);

                newOperands.Add(pair.Key, newOpExpr);
            }

            oldOperands.OperandsDictionary.Clear();

            foreach (var pair in newOperands)
            {
                oldOperands.AddOperand(pair.Key, pair.Value);
            }

            return(oldOperands);
        }
示例#19
0
 /// <summary>
 /// Replace the occurances of the given l-value inside the given language operator with the given atomic expression
 /// </summary>
 /// <param name="oldLangOperator"></param>
 /// <param name="oldLvalue"></param>
 /// <param name="newExpr"></param>
 /// <returns></returns>
 public abstract ILanguageOperator ReplaceLValueByExpression(ILanguageOperator oldLangOperator, SymbolLValue oldLvalue, ILanguageExpressionAtomic newExpr);
示例#20
0
 internal BasicUnary CreateTransformExpression(ILanguageExpressionAtomic operand)
 {
     return(BasicUnary.Create(TargetFrame.MultivectorType, this, operand));
 }
示例#21
0
        public OperandsByValueAccess ReplaceLValueByExpression(OperandsByValueAccess oldOperands, SymbolLValue oldLvalue, ILanguageExpressionAtomic newExpr)
        {
            foreach (var assignment in oldOperands.AssignmentsList)
            {
                var newOpExpr = ReplaceLValueByExpression(assignment.RhsExpression, oldLvalue, newExpr);

                assignment.ChangeRhsExpression(newOpExpr);
            }

            return(oldOperands);
        }
示例#22
0
        public OperandsList ReplaceLValueByExpression(OperandsList oldOperands, SymbolLValue oldLvalue, ILanguageExpressionAtomic newExpr)
        {
            for (var i = 0; i < oldOperands.Operands.Count; i++)
            {
                var newOpExpr = ReplaceLValueByExpression(oldOperands.Operands[i], oldLvalue, newExpr);

                oldOperands.ChangeOperand(i, newOpExpr);
            }

            return(oldOperands);
        }
        private ILanguageExpression translate_Expression_Function_Subspace(GMacFrameSubspace subspace, ILanguageExpressionAtomic defaultValueSource, ParseTreeNode node)
        {
            var operands = OperandsByIndex.Create();

            if (node.ChildNodes.Count <= 0)
            {
                return
                    (ReferenceEquals(defaultValueSource, null)
                    ? subspace.ParentFrame.MultivectorType.CreateConstructorExpression(operands)
                    : subspace.ParentFrame.MultivectorType.CreateConstructorExpression(defaultValueSource, operands));
            }

            var expressionFunctionInputsNode = node.ChildNodes[0];

            var subNode = expressionFunctionInputsNode.ChildNodes[0];

            switch (subNode.Term.ToString())
            {
            //case GMacParseNodeNames.ExpressionFunctionInputsAssignments:
            //    var expressionFunctionInputsAssignmentsNode = subNode;

            //    foreach (var nodeExpressionFunctionInputsAssignmentsItem in expressionFunctionInputsAssignmentsNode.ChildNodes)
            //    {
            //        var lhsNode = nodeExpressionFunctionInputsAssignmentsItem.ChildNodes[0].ChildNodes[0];
            //        var rhsNode = nodeExpressionFunctionInputsAssignmentsItem.ChildNodes[1];

            //        if (lhsNode.Term.Name == GMacParseNodeNames.BasisBladeCoefficient)
            //        {
            //            var basisBladeId = translate_BasisBladeCoefficient(subspace.ParentFrame.MultivectorType, lhsNode);

            //            var rhsExpr =
            //                BasicExpressionGenerator.Generate_PolyadicOperand(
            //                    GMacRootAst.ScalarType,
            //                    GMacExpressionGenerator.Translate(BasicExpressionGenerator, rhsNode)
            //                    );

            //            operands.AddOperand(basisBladeId, rhsExpr);
            //        }
            //        else
            //            return CompilationLog.RaiseGeneratorError<ILanguageExpression>("Expecting a list of basis blade assignments as input to the multivector construction", node);
            //    }

            //    break;

            case GMacParseNodeNames.ExpressionFunctionInputsExpressions:
                var expressionFunctionInputsExpressionsNode = subNode;

                var i = 0;

                foreach (var basisBladeId in subspace.SubspaceSignaturePattern.TrueIndexes)
                {
                    if (i >= expressionFunctionInputsExpressionsNode.ChildNodes.Count)
                    {
                        break;
                    }

                    var rhsNode = expressionFunctionInputsExpressionsNode.ChildNodes[i];

                    var rhsExpr =
                        BasicExpressionGenerator.Generate_PolyadicOperand(
                            GMacRootAst.ScalarType,
                            GMacExpressionGenerator.Translate(BasicExpressionGenerator, rhsNode)
                            );

                    operands.AddOperand(basisBladeId, rhsExpr);

                    i = i + 1;
                }

                if (expressionFunctionInputsExpressionsNode.ChildNodes.Count > i)
                {
                    return(CompilationLog.RaiseGeneratorError <ILanguageExpression>("Expecting a list of at most " + i + " expression as input to the multivector subspace construction", node));
                }

                break;

            default:
                return(CompilationLog.RaiseGeneratorError <ILanguageExpression>("Expecting a list of expressions as input to the multivector subspace construction", node));
            }

            return
                (ReferenceEquals(defaultValueSource, null)
                ? subspace.ParentFrame.MultivectorType.CreateConstructorExpression(operands)
                : subspace.ParentFrame.MultivectorType.CreateConstructorExpression(defaultValueSource, operands));
        }
示例#24
0
 /// <summary>
 /// Add a new operand to this list
 /// </summary>
 /// <param name="lhsValAccess">The value access process for this operand</param>
 /// <param name="rhsExpr">The RHS expression of the operand</param>
 public void AddOperand(LanguageValueAccess lhsValAccess, ILanguageExpressionAtomic rhsExpr)
 {
     AssignmentsList.Add(new OperandsByValueAccessAssignment(lhsValAccess, rhsExpr));
 }
示例#25
0
        public BasicUnary ReplaceLValueByExpression(BasicUnary oldExpr, SymbolLValue oldLvalue, ILanguageExpressionAtomic newExpr)
        {
            ReplaceLValueByExpression(oldExpr.Operator, oldLvalue, newExpr);

            oldExpr.ChangeOperand(ReplaceLValueByExpression(oldExpr.Operand, oldLvalue, newExpr));

            return(oldExpr);
        }
示例#26
0
        public BasicPolyadic ReplaceLValueByExpression(BasicPolyadic oldExpr, SymbolLValue oldLvalue, ILanguageExpressionAtomic newExpr)
        {
            ReplaceLValueByExpression(oldExpr.Operator, oldLvalue, newExpr);

            var t1 = oldExpr.Operands as OperandsByIndex;

            if (t1 != null)
            {
                ReplaceLValueByExpression(t1, oldLvalue, newExpr);
                return(oldExpr);
            }

            var t2 = oldExpr.Operands as OperandsByName;

            if (t2 != null)
            {
                ReplaceLValueByExpression(t2, oldLvalue, newExpr);
                return(oldExpr);
            }

            var t3 = oldExpr.Operands as OperandsList;

            if (t3 != null)
            {
                ReplaceLValueByExpression(t3, oldLvalue, newExpr);
                return(oldExpr);
            }

            var t4 = oldExpr.Operands as OperandsByValueAccess;

            if (t4 == null)
            {
                return(oldExpr);
            }

            ReplaceLValueByExpression(t4, oldLvalue, newExpr);
            return(oldExpr);
        }
        private ILanguageExpression translate_Expression_Function_Structure(GMacStructure structure, ILanguageExpressionAtomic defaultValueSource, ParseTreeNode node)
        {
            var operands = OperandsByValueAccess.Create();

            if (node.ChildNodes.Count == 0)
            {
                return
                    (defaultValueSource == null
                    ? structure.CreateConstructorExpression(operands)
                    : structure.CreateConstructorExpression(defaultValueSource, operands));
            }

            var expressionFunctionInputsNode = node.ChildNodes[0];

            var subNode = expressionFunctionInputsNode.ChildNodes[0];

            switch (subNode.Term.ToString())
            {
            case GMacParseNodeNames.ExpressionFunctionInputsAssignments:
                var expressionFunctionInputsAssignmentsNode = subNode;

                foreach (var nodeExpressionFunctionInputsAssignmentsItem in expressionFunctionInputsAssignmentsNode.ChildNodes)
                {
                    var lhsNode = nodeExpressionFunctionInputsAssignmentsItem.ChildNodes[0].ChildNodes[0];
                    var rhsNode = nodeExpressionFunctionInputsAssignmentsItem.ChildNodes[1];

                    var lhsValAccess = GMacValueAccessGenerator.Translate_LValue_StructureMember(Context, lhsNode, structure);

                    var rhsExpr =
                        BasicExpressionGenerator.Generate_PolyadicOperand(
                            lhsValAccess.ExpressionType,
                            GMacExpressionGenerator.Translate(BasicExpressionGenerator, rhsNode)
                            );

                    operands.AddOperand(lhsValAccess, rhsExpr);
                }

                break;

            case GMacParseNodeNames.ExpressionFunctionInputsExpressions:
                var expressionFunctionInputsExpressionsNode = subNode;

                var i = 0;

                foreach (var dataMember in structure.DataMembers)
                {
                    if (i >= expressionFunctionInputsExpressionsNode.ChildNodes.Count)
                    {
                        break;
                    }

                    var rhsNode = expressionFunctionInputsExpressionsNode.ChildNodes[i];

                    var lhsValAccess = LanguageValueAccess.Create(dataMember);

                    var rhsExpr =
                        BasicExpressionGenerator.Generate_PolyadicOperand(
                            lhsValAccess.ExpressionType,
                            GMacExpressionGenerator.Translate(BasicExpressionGenerator, rhsNode)
                            );

                    operands.AddOperand(lhsValAccess, rhsExpr);

                    i = i + 1;
                }

                if (expressionFunctionInputsExpressionsNode.ChildNodes.Count > i)
                {
                    return(CompilationLog.RaiseGeneratorError <ILanguageExpression>("Expecting a list of at most " + i + " expression as input to the structure construction", node));
                }

                break;

            default:
                return(CompilationLog.RaiseGeneratorError <ILanguageExpression>("Expecting a list of expressions or a list of member assignments as input to the structure construction", node));
            }

            return
                (defaultValueSource == null
                ? structure.CreateConstructorExpression(operands)
                : structure.CreateConstructorExpression(defaultValueSource, operands));
        }
示例#28
0
        public ILanguageExpressionAtomic ReplaceLValueByExpression(LanguageValueAccess oldValueAccess, SymbolLValue oldLvalue, ILanguageExpressionAtomic newExpr)
        {
            //If the old value acceess does not depend on the old_lvalue just return the old value access as is
            if (oldValueAccess.HasAccessStepWithSymbol(oldLvalue) == false)
            {
                return(oldValueAccess);
            }

            //If the old value access is a full access just return the new atomic expression
            if (oldValueAccess.IsFullAccess)
            {
                return(newExpr);
            }

            //If the new expression is a language value access
            var valAccess = newExpr as LanguageValueAccess;

            if (valAccess != null)
            {
                oldValueAccess.ReplaceRootSymbol(valAccess);

                foreach (var component in oldValueAccess.PartialAccessStepsByLValue(oldLvalue))
                {
                    if (valAccess.IsFullAccess)
                    {
                        component.ReplaceComponentSymbol(valAccess.RootSymbolAsLValue);
                    }
                    else
                    {
                        throw new InvalidOperationException("Can't replace a symbol with a non-symbol in this access step");
                    }
                }

                return(oldValueAccess);
            }

            if (!(newExpr is ILanguageValue))
            {
                return(oldValueAccess);
            }

            if (oldValueAccess.IsVariableAccess)
            {
                throw new InvalidOperationException("Can't replace a symbol with a non-symbol in this access process");
            }

            return(ReadPartialValue((ILanguageValue)newExpr, oldValueAccess));
        }
        private ILanguageExpression translate_Expression_Function_MultivectorType(GMacFrameMultivector mvType, ILanguageExpressionAtomic defaultValueSource, ParseTreeNode node)
        {
            var operands = OperandsByIndex.Create();

            if (node.ChildNodes.Count <= 0)
            {
                return
                    (ReferenceEquals(defaultValueSource, null)
                    ? mvType.CreateConstructorExpression(operands)
                    : mvType.CreateConstructorExpression(defaultValueSource, operands));
            }

            var expressionFunctionInputsNode = node.ChildNodes[0];

            var subNode = expressionFunctionInputsNode.ChildNodes[0];

            switch (subNode.Term.ToString())
            {
            case GMacParseNodeNames.ExpressionFunctionInputsAssignments:
                var expressionFunctionInputsAssignmentsNode = subNode;

                foreach (var nodeExpressionFunctionInputsAssignmentsItem in expressionFunctionInputsAssignmentsNode.ChildNodes)
                {
                    var lhsNode = nodeExpressionFunctionInputsAssignmentsItem.ChildNodes[0].ChildNodes[0];
                    var rhsNode = nodeExpressionFunctionInputsAssignmentsItem.ChildNodes[1];

                    if (lhsNode.Term.Name == GMacParseNodeNames.BasisBladeCoefficient)
                    {
                        var basisBladeId = translate_BasisBladeCoefficient(mvType, lhsNode);

                        var rhsExpr =
                            BasicExpressionGenerator.Generate_PolyadicOperand(
                                GMacRootAst.ScalarType,
                                GMacExpressionGenerator.Translate(BasicExpressionGenerator, rhsNode)
                                );

                        operands.AddOperand(basisBladeId, rhsExpr);
                    }
                    else
                    {
                        return(CompilationLog.RaiseGeneratorError <ILanguageExpression>("Expecting a list of basis blade assignments as input to the multivector construction", node));
                    }
                }

                break;

            case GMacParseNodeNames.ExpressionFunctionInputsExpressions:
                return
                    (ReferenceEquals(defaultValueSource, null)
                            ? translate_Expression_Function_Cast(mvType, node)
                            : CompilationLog.RaiseGeneratorError <ILanguageExpression>("A default value cannot be used for a type cast operation", node));

            default:
                return(CompilationLog.RaiseGeneratorError <ILanguageExpression>("Expecting a list of basis blade assignments as input to the multivector construction", node));
            }

            return
                (ReferenceEquals(defaultValueSource, null)
                ? mvType.CreateConstructorExpression(operands)
                : mvType.CreateConstructorExpression(defaultValueSource, operands));
        }
示例#30
0
        public virtual ILanguageExpression ReplaceLValueByExpression(ILanguageExpression oldExpr, SymbolLValue oldLvalue, ILanguageExpressionAtomic newExpr)
        {
            var t1 = oldExpr as LanguageValueAccess;

            if (t1 != null)
            {
                return(ReplaceLValueByExpression(t1, oldLvalue, newExpr));
            }

            var t2 = oldExpr as BasicUnary;

            if (t2 != null)
            {
                return(ReplaceLValueByExpression(t2, oldLvalue, newExpr));
            }

            var t3 = oldExpr as BasicBinary;

            if (t3 != null)
            {
                return(ReplaceLValueByExpression(t3, oldLvalue, newExpr));
            }

            var t4 = oldExpr as BasicPolyadic;

            return
                (t4 == null
                ? oldExpr
                : ReplaceLValueByExpression(t4, oldLvalue, newExpr));
        }