Search in sources :

Example 1 with Factor

use of org.osate.ba.aadlba.Factor in project osate2 by osate.

the class AdaLikeDataTypeChecker method checkDefinition.

@Override
public TypeHolder checkDefinition(BehaviorElement e, Enumerator operator, TypeHolder operand1, TypeHolder operand2) {
    // Operator ** has special consistency checking.
    if (operator != BinaryNumericOperator.MULTIPLY_MULTIPLY && !conformsTo(operand1, operand2, true)) {
        reportErrorConsystency(e, operator, operand1, operand2);
        return null;
    }
    if (operator instanceof LogicalOperator) {
        if (operand1.getDataRep() == DataRepresentation.BOOLEAN) {
            return getTopLevelTypeWithoutConsistencyChecking(operand1, operand1);
        } else {
            reportErrorBinaryOperator(e, operator, operand1);
            return null;
        }
    } else if (operator instanceof RelationalOperator) {
        RelationalOperator rop = (RelationalOperator) operator;
        DataRepresentation[] expectedTypes = null;
        // Operators = and != are defined for all coherent types.
        if (rop == RelationalOperator.EQUAL || rop == RelationalOperator.NOT_EQUAL) {
            return new TypeHolder(DataRepresentation.BOOLEAN, null);
        }
        expectedTypes = _alphaNumTypes;
        if (Aadl2Utils.contains(operand1.getDataRep(), expectedTypes)) {
            return new TypeHolder(DataRepresentation.BOOLEAN, null);
        } else {
            reportErrorBinaryOperator(e, operator, operand1);
            return null;
        }
    } else if (operator instanceof BinaryAddingOperator) {
        if (Aadl2Utils.contains(operand1.getDataRep(), _numTypes)) {
            return getTopLevelTypeWithoutConsistencyChecking(operand1, operand2);
        } else {
            reportErrorBinaryOperator(e, operator, operand1);
            return null;
        }
    } else if (operator instanceof MultiplyingOperator) {
        MultiplyingOperator op = (MultiplyingOperator) operator;
        switch(op) {
            case MULTIPLY:
            case DIVIDE:
                {
                    if (Aadl2Utils.contains(operand1.getDataRep(), _numTypes)) {
                        return getTopLevelTypeWithoutConsistencyChecking(operand1, operand2);
                    } else {
                        reportErrorBinaryOperator(e, operator, operand1);
                        return null;
                    }
                }
            case MOD:
            case REM:
                {
                    if (operand1.getDataRep() == DataRepresentation.INTEGER) {
                        return getTopLevelTypeWithoutConsistencyChecking(operand1, operand2);
                    } else {
                        reportErrorBinaryOperator(e, operator, operand1);
                        return null;
                    }
                }
            default:
                return null;
        }
    } else if (operator instanceof BinaryNumericOperator) {
        // Checks operands consistency:
        if (Aadl2Utils.contains(operand1.getDataRep(), _numTypesWithoutFixed)) {
            boolean reportError = false;
            if (operand2.getDataRep() == DataRepresentation.INTEGER) {
                // Datatyped operand case : checks if operand2 is a natural.
                if (operand2.getKlass() != null) {
                    EList<org.osate.aadl2.PropertyExpression> l = PropertyUtils.findPropertyExpression(operand2.getKlass(), DataModelProperties.INTEGER_RANGE);
                    if (l.size() > 0) {
                        RangeValue rv = (RangeValue) l.get(l.size() - 1);
                        if (rv.getMinimumValue().getScaledValue() < 0) {
                            reportError = true;
                        }
                    } else {
                        reportError = true;
                    }
                } else // constant data case : checks if the constant value is not
                // negative.
                {
                    if (e instanceof Factor) {
                        Value val = ((Factor) e).getSecondValue();
                        // PropertyConstants and warns PropertyValues.
                        if (val instanceof BehaviorPropertyConstant) {
                            BehaviorPropertyConstant bpc = (BehaviorPropertyConstant) val;
                            org.osate.aadl2.PropertyConstant pc = bpc.getProperty();
                            org.osate.aadl2.IntegerLiteral intLit = (org.osate.aadl2.IntegerLiteral) pc.getConstantValue();
                            if (intLit.getValue() < 0) {
                                reportError = true;
                            }
                        } else if (val instanceof PropertyReference) // PropertyValue case : its value can only be evaluated at
                        // runtime so raises a warning.
                        {
                            _errManager.warning(e, "Cannot evaluate if the exponent" + " is a natural");
                        }
                    }
                }
            } else {
                reportError = true;
            }
            if (reportError) {
                _errManager.error(e, "exponent must be of type natural, found " + operand2.toString());
                return null;
            } else {
                return operand1;
            }
        } else {
            reportErrorConsystency(e, operator, operand1, operand2);
            return null;
        }
    } else {
        String errorMsg = "operator : " + operator.getName() + " is not supported.";
        System.err.println(errorMsg);
        throw new UnsupportedOperationException(errorMsg);
    }
}
Also used : RelationalOperator(org.osate.ba.aadlba.RelationalOperator) LogicalOperator(org.osate.ba.aadlba.LogicalOperator) RangeValue(org.osate.aadl2.RangeValue) PropertyReference(org.osate.ba.aadlba.PropertyReference) BehaviorPropertyConstant(org.osate.ba.aadlba.BehaviorPropertyConstant) Factor(org.osate.ba.aadlba.Factor) BinaryAddingOperator(org.osate.ba.aadlba.BinaryAddingOperator) RangeValue(org.osate.aadl2.RangeValue) Value(org.osate.ba.aadlba.Value) MultiplyingOperator(org.osate.ba.aadlba.MultiplyingOperator) BinaryNumericOperator(org.osate.ba.aadlba.BinaryNumericOperator)

Example 2 with Factor

use of org.osate.ba.aadlba.Factor in project osate2 by osate.

the class AadlBaUtils method isOnlyOneValue.

/**
 * If the given value expression is composed of an single value, it returns
 * this value otherwise {@code null}. Recursive method.
 *
 * @param ve the given value expression
 * @return the value or {@code null}
 */
public static Value isOnlyOneValue(ValueExpression ve) {
    Relation firstRelation = ve.getRelations().get(0);
    SimpleExpression firstSE = firstRelation.getFirstExpression();
    Term firstTerm = firstSE.getTerms().get(0);
    Factor firstFactor = firstTerm.getFactors().get(0);
    Value firstValue = firstFactor.getFirstValue();
    if (ve.getRelations().size() == 1) {
        if (firstRelation.getSecondExpression() == null) {
            if (firstSE.getTerms().size() == 1) {
                if (firstTerm.getFactors().size() == 1) {
                    if (firstFactor.getSecondValue() == null) {
                        // Recursive case.
                        if (firstValue instanceof ValueExpression) {
                            return isOnlyOneValue((ValueExpression) firstValue);
                        } else {
                            return firstValue;
                        }
                    }
                }
            }
        }
    }
    return null;
}
Also used : Relation(org.osate.ba.aadlba.Relation) Factor(org.osate.ba.aadlba.Factor) ValueExpression(org.osate.ba.aadlba.ValueExpression) ListValue(org.osate.aadl2.ListValue) PortFreshValue(org.osate.ba.aadlba.PortFreshValue) IntegerValue(org.osate.ba.aadlba.IntegerValue) ClassifierValue(org.osate.aadl2.ClassifierValue) NamedValue(org.osate.aadl2.NamedValue) PortCountValue(org.osate.ba.aadlba.PortCountValue) ModalPropertyValue(org.osate.aadl2.ModalPropertyValue) Value(org.osate.ba.aadlba.Value) Term(org.osate.ba.aadlba.Term) SimpleExpression(org.osate.ba.aadlba.SimpleExpression)

Example 3 with Factor

use of org.osate.ba.aadlba.Factor in project osate2 by osate.

the class AadlBaUnparser method initSwitches.

/**
 * Specific aadlba switch to unparse components
 */
protected void initSwitches() {
    aadlbaSwitch = new AadlBaSwitch<String>() {

        /**
         * Top-level method to unparse "behavior_specification"
         * annexsubclause
         */
        // public String caseAnnexSubclause(AnnexSubclause object) {
        // //FIXME : TODO : update location reference
        // 
        // process((BehaviorAnnex) object);
        // 
        // return DONE;
        // }
        /**
         * Unparse behaviorannex
         */
        @Override
        public String caseBehaviorAnnex(BehaviorAnnex object) {
            // DB: Improve code formatting
            aadlbaText.addOutputNewline("");
            // FIXME : TODO : update location reference
            if (object.isSetVariables()) {
                aadlbaText.addOutputNewline("variables");
                aadlbaText.incrementIndent();
                processEList(object.getVariables());
                aadlbaText.decrementIndent();
            }
            if (object.isSetStates()) {
                aadlbaText.addOutputNewline("states");
                aadlbaText.incrementIndent();
                processEList(object.getStates());
                aadlbaText.decrementIndent();
            }
            if (object.isSetTransitions()) {
                aadlbaText.addOutputNewline("transitions");
                aadlbaText.incrementIndent();
                processEList(object.getTransitions());
                aadlbaText.decrementIndent();
            }
            return DONE;
        }

        /**
         * Unparse behaviorvariable
         */
        @Override
        public String caseBehaviorVariable(BehaviorVariable object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutput(object.getName());
            for (ArrayDimension ad : object.getArrayDimensions()) {
                aadlbaText.addOutput("[");
                if (ad instanceof DeclarativeArrayDimension) {
                    DeclarativeArrayDimension dad = (DeclarativeArrayDimension) ad;
                    process(dad.getDimension());
                } else if (ad instanceof ArrayDimension) {
                    aadlbaText.addOutput(Long.toString(ad.getSize().getSize()));
                }
                aadlbaText.addOutput("]");
            }
            aadlbaText.addOutput(" : ");
            if (object.getDataClassifier() instanceof QualifiedNamedElement) {
                QualifiedNamedElement qn = (QualifiedNamedElement) object.getDataClassifier();
                aadlbaText.addOutput(getNamespace(qn));
                process(qn);
            } else if (object.getDataClassifier() instanceof DataClassifier) {
                aadlbaText.addOutput(object.getDataClassifier().getQualifiedName());
            }
            aadlbaText.addOutputNewline(";");
            return DONE;
        }

        private String getNamespace(final QualifiedNamedElement qn) {
            final Identifier baNameSpace = qn.getBaNamespace();
            final StringBuilder nameSpace = new StringBuilder();
            if (baNameSpace != null && !Strings.isNullOrEmpty(baNameSpace.getId())) {
                nameSpace.append(baNameSpace.getId()).append("::");
            }
            return nameSpace.toString();
        }

        /**
         * Unparse behaviorstate
         */
        @Override
        public String caseBehaviorState(BehaviorState object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutput(object.getName());
            aadlbaText.addOutput(" : ");
            if (object.isInitial()) {
                aadlbaText.addOutput("initial ");
            }
            if (object.isComplete()) {
                aadlbaText.addOutput("complete ");
            }
            if (object.isFinal()) {
                aadlbaText.addOutput("final ");
            }
            aadlbaText.addOutputNewline("state;");
            return DONE;
        }

        /**
         * Unparse behaviortransition
         */
        @Override
        public String caseBehaviorTransition(BehaviorTransition object) {
            // FIXME : TODO : update location reference
            String tid = object.getName();
            Long num = object.getPriority();
            if (tid != null) {
                aadlbaText.addOutput(tid);
                if (num != AadlBaVisitors.DEFAULT_TRANSITION_PRIORITY) {
                    // numeral
                    aadlbaText.addOutput(" [");
                    aadlbaText.addOutput(String.valueOf(num));
                    aadlbaText.addOutput("]");
                }
                aadlbaText.addOutput(" : ");
            }
            if (object.getSourceState() != null) {
                aadlbaText.addOutput(object.getSourceState().getName());
            } else if (object instanceof DeclarativeBehaviorTransition) {
                DeclarativeBehaviorTransition dbt = (DeclarativeBehaviorTransition) object;
                for (Identifier id : dbt.getSrcStates()) {
                    aadlbaText.addOutput(id.getId());
                    if (dbt.getSrcStates().get(dbt.getSrcStates().size() - 1) != id) {
                        aadlbaText.addOutput(",");
                    }
                }
            }
            aadlbaText.addOutput(" -[");
            process(object.getCondition());
            aadlbaText.addOutput("]-> ");
            if (object.getDestinationState() != null) {
                aadlbaText.addOutput(object.getDestinationState().getName());
            } else if (object instanceof DeclarativeBehaviorTransition) {
                DeclarativeBehaviorTransition dbt = (DeclarativeBehaviorTransition) object;
                aadlbaText.addOutput(dbt.getDestState().getId());
            }
            if (object.getActionBlock() != null) {
                aadlbaText.addOutput(" ");
                process(object.getActionBlock());
            }
            aadlbaText.addOutputNewline(";");
            return DONE;
        }

        @Override
        public String caseExecutionTimeoutCatch(ExecutionTimeoutCatch object) {
            aadlbaText.addOutput("timeout");
            return DONE;
        }

        @Override
        public String caseOtherwise(Otherwise object) {
            aadlbaText.addOutput("otherwise");
            return DONE;
        }

        /**
         * Unparse dispatchcondition
         */
        @Override
        public String caseDispatchCondition(DispatchCondition object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutput("on dispatch");
            if (object.getDispatchTriggerCondition() != null) {
                aadlbaText.addOutput(" ");
                process(object.getDispatchTriggerCondition());
            }
            if (object.isSetFrozenPorts()) {
                aadlbaText.addOutput(" frozen ");
                processEList(object.getFrozenPorts(), ", ");
            }
            return DONE;
        }

        @Override
        public String caseDispatchTriggerConditionStop(DispatchTriggerConditionStop object) {
            aadlbaText.addOutput("stop");
            return DONE;
        }

        @Override
        public String caseDispatchRelativeTimeout(DispatchRelativeTimeout object) {
            aadlbaText.addOutput("timeout ");
            return DONE;
        }

        @Override
        public String caseCompletionRelativeTimeout(CompletionRelativeTimeout object) {
            aadlbaText.addOutput("timeout ");
            caseBehaviorTime(object);
            return DONE;
        }

        @Override
        public String caseDispatchTriggerLogicalExpression(DispatchTriggerLogicalExpression object) {
            processEList(object.getDispatchConjunctions(), " or ");
            return DONE;
        }

        @Override
        public String caseDispatchConjunction(DispatchConjunction object) {
            processEList(object.getDispatchTriggers(), " and ");
            return DONE;
        }

        @Override
        public String caseBehaviorActionBlock(BehaviorActionBlock object) {
            aadlbaText.addOutputNewline("{");
            aadlbaText.incrementIndent();
            // aadlbaText.addOutput("{");
            process(object.getContent());
            aadlbaText.decrementIndent();
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutput("}");
            if (object.getTimeout() != null) {
                aadlbaText.addOutput(" timeout ");
                process(object.getTimeout());
            }
            return DONE;
        }

        @Override
        public String caseBehaviorActionSequence(BehaviorActionSequence object) {
            // DB: Indentation problem when using \n direcly
            processEList(object.getActions(), ";", true);
            // processEList(object.getActions(), ";\n");
            return DONE;
        }

        @Override
        public String caseBehaviorActionSet(BehaviorActionSet object) {
            // DB: Indentation problem when using \n direcly
            processEList(object.getActions(), " &", true);
            // processEList(object.getActions(), " &\n");
            return DONE;
        }

        /**
         * Unparse ifstatement
         */
        @Override
        public String caseIfStatement(IfStatement object) {
            // FIXME : TODO : update location reference
            boolean hasToOutputTerminator = true;
            if (object.isElif()) {
                aadlbaText.addOutputNewline("");
                aadlbaText.addOutput("elsif (");
                hasToOutputTerminator = false;
            } else {
                aadlbaText.addOutput("if (");
                hasToOutputTerminator = true;
            }
            process(object.getLogicalValueExpression());
            aadlbaText.addOutputNewline(")");
            aadlbaText.incrementIndent();
            process(object.getBehaviorActions());
            aadlbaText.decrementIndent();
            if (object.getElseStatement() != null) {
                process(object.getElseStatement());
            }
            if (hasToOutputTerminator) {
                aadlbaText.addOutputNewline("");
                aadlbaText.addOutput("end if");
            }
            return DONE;
        }

        @Override
        public String caseElseStatement(ElseStatement object) {
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutputNewline("else");
            aadlbaText.incrementIndent();
            process(object.getBehaviorActions());
            aadlbaText.decrementIndent();
            return DONE;
        }

        /**
         * Unparse fororforallstatement
         */
        @Override
        public String caseForOrForAllStatement(ForOrForAllStatement object) {
            // FIXME : TODO : update location reference
            if (object.isForAll()) {
                aadlbaText.addOutput("forall (");
            } else {
                aadlbaText.addOutput("for (");
            }
            process(object.getIterativeVariable());
            aadlbaText.addOutput(" in ");
            process(object.getIteratedValues());
            aadlbaText.addOutputNewline(") {");
            // aadlbaText.addOutputNewline("{");
            aadlbaText.incrementIndent();
            process(object.getBehaviorActions());
            aadlbaText.decrementIndent();
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutput("}");
            return DONE;
        }

        @Override
        public String caseIterativeVariable(IterativeVariable iv) {
            aadlbaText.addOutput(iv.getName());
            aadlbaText.addOutput(" : ");
            // DB: Use qualified name when classifier is declared outside the package
            final DataClassifier dataClass = iv.getDataClassifier();
            final String dataClassName;
            if (dataClass.getElementRoot() == iv.getElementRoot()) {
                dataClassName = dataClass.getName();
            } else {
                dataClassName = dataClass.getQualifiedName();
            }
            aadlbaText.addOutput(dataClassName);
            return DONE;
        }

        @Override
        public String caseWhileOrDoUntilStatement(WhileOrDoUntilStatement object) {
            if (object.isDoUntil()) {
                return caseDoUntilStatement(object);
            } else {
                return caseWhileStatement(object);
            }
        }

        /**
         * Unparse whilestatement
         */
        public String caseWhileStatement(WhileOrDoUntilStatement object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutput("while (");
            process(object.getLogicalValueExpression());
            aadlbaText.addOutputNewline(") {");
            // aadlbaText.addOutputNewline("{");
            aadlbaText.incrementIndent();
            process(object.getBehaviorActions());
            aadlbaText.decrementIndent();
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutputNewline("}");
            return DONE;
        }

        /**
         * Unparse dountilstatement
         */
        public String caseDoUntilStatement(WhileOrDoUntilStatement object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutputNewline("do");
            process(object.getBehaviorActions());
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutput("until (");
            process(object.getLogicalValueExpression());
            aadlbaText.addOutputNewline(")");
            return DONE;
        }

        /**
         * Unparse integerrange
         */
        @Override
        public String caseIntegerRange(IntegerRange object) {
            // FIXME : TODO : update location reference
            process(object.getLowerIntegerValue());
            aadlbaText.addOutput(" .. ");
            process(object.getUpperIntegerValue());
            return DONE;
        }

        /**
         * Unparse timedaction
         */
        @Override
        public String caseTimedAction(TimedAction object) {
            aadlbaText.addOutput("computation (");
            process(object.getLowerTime());
            if (object.getUpperTime() != null) {
                aadlbaText.addOutput(" .. ");
                process(object.getUpperTime());
            }
            aadlbaText.addOutput(")");
            if (object.isSetProcessorClassifier()) {
                aadlbaText.addOutput(" in binding (");
                processEList(object.getProcessorClassifier(), ", ", object, false);
                aadlbaText.addOutput(")");
            }
            return DONE;
        }

        /**
         * Unparse assignmentaction
         */
        @Override
        public String caseAssignmentAction(AssignmentAction object) {
            // FIXME : TODO : update location reference
            process(object.getTarget());
            aadlbaText.addOutput(" := ");
            process(object.getValueExpression());
            return DONE;
        }

        @Override
        public String caseAny(Any object) {
            aadlbaText.addOutput("any");
            return DONE;
        }

        @Override
        public String caseElementHolder(ElementHolder el) {
            if (el instanceof Reference) {
                return processReference((Reference) el);
            }
            Element refContainer = Aadl2Visitors.getContainingPackageSection(el.getElement());
            Element holderPackageOrPropertySet = Aadl2Visitors.getContainingPackageSection(el);
            if (refContainer != null && holderPackageOrPropertySet != null && false == holderPackageOrPropertySet.equals(refContainer) && false == (el instanceof DataSubcomponentHolder)) {
                StringBuilder sb = new StringBuilder(el.getElement().getQualifiedName());
                String prefix = sb.substring(0, sb.lastIndexOf("::") + 2);
                aadlbaText.addOutput(prefix);
            }
            if (el instanceof GroupableElement) {
                GroupableElement ge = (GroupableElement) el;
                if (ge.isSetGroupHolders()) {
                    processEList(ge.getGroupHolders(), ".");
                    aadlbaText.addOutput(".");
                }
            }
            aadlbaText.addOutput(el.getElement().getName());
            if (el instanceof IndexableElement) {
                IndexableElement ie = (IndexableElement) el;
                if (ie.isSetArrayIndexes()) {
                    caseArrayIndex(ie.getArrayIndexes());
                }
            }
            return DONE;
        }

        private String processReference(Reference ref) {
            for (ArrayableIdentifier id : ref.getIds()) {
                aadlbaText.addOutput(id.getId());
                caseArrayIndex(id.getArrayIndexes());
                if (id != ref.getIds().get(ref.getIds().size() - 1)) {
                    aadlbaText.addOutput(".");
                }
            }
            return DONE;
        }

        private String processCommAction(CommAction object) {
            process(object.getReference());
            if (object.isLock()) {
                aadlbaText.addOutput("!<");
            } else if (object.isUnlock()) {
                aadlbaText.addOutput("!>");
            } else if (object.isPortDequeue()) {
                aadlbaText.addOutput(" ?");
            } else {
                aadlbaText.addOutput(" !");
            }
            if (object.isSetParameters() == true) {
                aadlbaText.addOutput(" (");
                processEList(object.getParameters(), ",");
                aadlbaText.addOutput(")");
                return DONE;
            } else if (object.getTarget() != null) {
                aadlbaText.addOutput(" (");
                process(object.getTarget());
                aadlbaText.addOutput(")");
                return DONE;
            }
            return DONE;
        }

        /**
         * Unparse arrayindex
         */
        public String caseArrayIndex(EList<IntegerValue> object) {
            // FIXME : TODO : update location reference
            for (IntegerValue iv : object) {
                aadlbaText.addOutput("[");
                process(iv);
                aadlbaText.addOutput("]");
            }
            return DONE;
        }

        /**
         * Unparse datacomponentreference
         */
        @Override
        public String caseDataComponentReference(DataComponentReference object) {
            // FIXME : TODO : update location reference
            processEList(object.getData(), ".");
            return DONE;
        }

        @Override
        public String defaultCase(EObject object) {
            if (object instanceof CommAction) {
                return processCommAction((CommAction) object);
            } else if (object instanceof Reference) {
                return processReference((Reference) object);
            } else if (object instanceof QualifiedNamedElement) {
                QualifiedNamedElement qn = (QualifiedNamedElement) object;
                aadlbaText.addOutput(qn.getBaName().getId());
            } else if (object instanceof org.osate.ba.declarative.NamedValue) {
                org.osate.ba.declarative.NamedValue nv = (org.osate.ba.declarative.NamedValue) object;
                process(nv.getReference());
                if (nv.isCount()) {
                    aadlbaText.addOutput("' count");
                }
                if (nv.isFresh()) {
                    aadlbaText.addOutput("' fresh");
                }
                if (nv.isDequeue()) {
                    aadlbaText.addOutput(" ?");
                }
            } else if (object instanceof DeclarativePropertyReference) {
                DeclarativePropertyReference dpr = (DeclarativePropertyReference) object;
                if (dpr.getQualifiedName().getBaName().getId().isEmpty()) {
                    aadlbaText.addOutput("#");
                }
                aadlbaText.addOutput(dpr.getQualifiedName().getBaNamespace().getId());
                aadlbaText.addOutput("::");
                if (false == dpr.getQualifiedName().getBaName().getId().isEmpty()) {
                    aadlbaText.addOutput(dpr.getQualifiedName().getBaName().getId());
                    aadlbaText.addOutput("#");
                }
                processEList(dpr.getPropertyNames(), ".");
            } else if (object instanceof DeclarativePropertyName) {
                DeclarativePropertyName dpn = (DeclarativePropertyName) object;
                aadlbaText.addOutput(dpn.getPropertyName().getId());
                // field
                process(dpn.getField());
                // indexes
                caseArrayIndex(dpn.getIndexes());
            }
            return DONE;
        }

        @Override
        public String caseSubprogramCallAction(SubprogramCallAction object) {
            if (object.getProxy() != null) {
                process(object.getProxy());
                aadlbaText.addOutput(".");
            }
            process(object.getSubprogram());
            aadlbaText.addOutput(" !");
            if (object.isSetParameterLabels()) {
                aadlbaText.addOutput(" (");
                processEList(object.getParameterLabels(), ", ");
                aadlbaText.addOutput(")");
            }
            return DONE;
        }

        @Override
        public String casePortSendAction(PortSendAction object) {
            process(object.getPort());
            aadlbaText.addOutput(" !");
            if (object.getValueExpression() != null) {
                aadlbaText.addOutput(" (");
                process(object.getValueExpression());
                aadlbaText.addOutput(")");
            }
            return DONE;
        }

        @Override
        public String casePortFreezeAction(PortFreezeAction object) {
            return casePortActionOrValue(object, " >>");
        }

        @Override
        public String casePortDequeueAction(PortDequeueAction object) {
            process(object.getPort());
            aadlbaText.addOutput(" ?");
            if (object.getTarget() != null) {
                aadlbaText.addOutput(" (");
                process(object.getTarget());
                aadlbaText.addOutput(")");
            }
            return DONE;
        }

        @Override
        public String caseLockAction(LockAction object) {
            return caseSharedDataAction(object, "!<");
        }

        @Override
        public String caseUnlockAction(UnlockAction object) {
            return caseSharedDataAction(object, "!>");
        }

        public String caseSharedDataAction(SharedDataAction object, String token) {
            if (object.getDataAccess() != null) {
                process(object.getDataAccess());
                aadlbaText.addOutput(" ");
            } else {
                aadlbaText.addOutput("*");
            }
            aadlbaText.addOutput(token);
            return DONE;
        }

        /**
         * Unparse behaviortime
         */
        @Override
        public String caseBehaviorTime(BehaviorTime object) {
            // FIXME : TODO : update location reference
            process(object.getIntegerValue());
            aadlbaText.addOutput(" ");
            if (object.getUnit() != null) {
                aadlbaText.addOutput(object.getUnit().getName());
            } else {
                if (object instanceof DeclarativeTime) {
                    DeclarativeTime dt = (DeclarativeTime) object;
                    aadlbaText.addOutput(dt.getUnitId().getId());
                }
            }
            return DONE;
        }

        @Override
        public String casePortDequeueValue(PortDequeueValue object) {
            return casePortActionOrValue(object, " ?");
        }

        @Override
        public String casePortCountValue(PortCountValue object) {
            return casePortActionOrValue(object, "' count");
        }

        @Override
        public String casePortFreshValue(PortFreshValue object) {
            return casePortActionOrValue(object, "' fresh");
        }

        public String casePortActionOrValue(PortHolder object, String token) {
            caseElementHolder(object);
            aadlbaText.addOutput(token);
            return DONE;
        }

        /**
         * Unparse booleanliteral
         */
        @Override
        public String caseBehaviorBooleanLiteral(BehaviorBooleanLiteral object) {
            // FIXME : TODO : update location reference
            if (object.isValue()) {
                aadlbaText.addOutput("true");
            } else {
                aadlbaText.addOutput("false");
            }
            return DONE;
        }

        /**
         * Unparse stringliteral
         */
        @Override
        public String caseBehaviorStringLiteral(BehaviorStringLiteral object) {
            // FIXME : TODO : update location reference
            // DB: Manage adding double quotes
            aadlbaText.addOutput(doubleQuoteString(object.getValue()));
            return DONE;
        }

        @Override
        public String caseBehaviorRealLiteral(BehaviorRealLiteral object) {
            aadlbaText.addOutput(String.valueOf(object.getValue()));
            return DONE;
        }

        @Override
        public String caseBehaviorIntegerLiteral(BehaviorIntegerLiteral object) {
            aadlbaText.addOutput(Long.toString(object.getValue()));
            return DONE;
        }

        /**
         * Unparse valueexpression
         */
        @Override
        public String caseValueExpression(ValueExpression object) {
            // FIXME : TODO : update location reference
            Iterator<Relation> itRel = object.getRelations().iterator();
            process(itRel.next());
            if (object.isSetLogicalOperators()) {
                Iterator<LogicalOperator> itOp = object.getLogicalOperators().iterator();
                while (itRel.hasNext()) {
                    LogicalOperator lo = itOp.next();
                    if (lo != LogicalOperator.NONE) {
                        aadlbaText.addOutput(" " + lo.getLiteral() + " ");
                    }
                    process(itRel.next());
                }
            }
            return DONE;
        }

        /**
         * Unparse relation
         */
        @Override
        public String caseRelation(Relation object) {
            // FIXME : TODO : update location reference
            process(object.getFirstExpression());
            if (object.getSecondExpression() != null) {
                if (object.getRelationalOperator() != RelationalOperator.NONE) {
                    aadlbaText.addOutput(" " + object.getRelationalOperator().getLiteral() + " ");
                }
                process(object.getSecondExpression());
            }
            return DONE;
        }

        /**
         * Unparse simpleexpression
         */
        @Override
        public String caseSimpleExpression(SimpleExpression object) {
            // FIXME : TODO : update location reference
            if (object.isSetUnaryAddingOperator() && object.getUnaryAddingOperator() != UnaryAddingOperator.NONE) {
                aadlbaText.addOutput(object.getUnaryAddingOperator().getLiteral());
            }
            Iterator<Term> itTerm = object.getTerms().iterator();
            process(itTerm.next());
            if (object.isSetBinaryAddingOperators()) {
                Iterator<BinaryAddingOperator> itOp = object.getBinaryAddingOperators().iterator();
                while (itTerm.hasNext()) {
                    BinaryAddingOperator bao = itOp.next();
                    if (bao != BinaryAddingOperator.NONE) {
                        aadlbaText.addOutput(" " + bao.getLiteral() + " ");
                    }
                    process(itTerm.next());
                }
            }
            return DONE;
        }

        /**
         * Unparse term
         */
        @Override
        public String caseTerm(Term object) {
            // FIXME : TODO : update location reference
            Iterator<Factor> itFact = object.getFactors().iterator();
            process(itFact.next());
            if (object.isSetMultiplyingOperators()) {
                Iterator<MultiplyingOperator> itOp = object.getMultiplyingOperators().iterator();
                while (itFact.hasNext()) {
                    MultiplyingOperator mo = itOp.next();
                    if (mo != MultiplyingOperator.NONE) {
                        aadlbaText.addOutput(" " + mo.getLiteral() + " ");
                    }
                    process(itFact.next());
                }
            }
            return DONE;
        }

        /**
         * Unparse factor
         */
        @Override
        public String caseFactor(Factor object) {
            // FIXME : TODO : update location reference
            if (object.isSetUnaryNumericOperator() || object.isSetUnaryBooleanOperator()) {
                Enumerator e = null;
                if (object.isSetUnaryNumericOperator()) {
                    e = object.getUnaryNumericOperator();
                    if (e != UnaryNumericOperator.NONE) {
                        aadlbaText.addOutput(e.getLiteral() + " ");
                    }
                } else if (object.isSetUnaryBooleanOperator()) {
                    e = object.getUnaryBooleanOperator();
                    if (e != UnaryBooleanOperator.NONE) {
                        aadlbaText.addOutput(e.getLiteral() + " ");
                    }
                }
            }
            if (object.getFirstValue() instanceof ValueExpression) {
                aadlbaText.addOutput("(");
                process(object.getFirstValue());
                aadlbaText.addOutput(")");
            } else {
                process(object.getFirstValue());
            }
            if (object.isSetBinaryNumericOperator()) {
                BinaryNumericOperator bno = object.getBinaryNumericOperator();
                if (bno != BinaryNumericOperator.NONE) {
                    aadlbaText.addOutput(" " + bno.getLiteral() + " ");
                }
                if (object.getSecondValue() instanceof ValueExpression) {
                    aadlbaText.addOutput("(");
                    process(object.getSecondValue());
                    aadlbaText.addOutput(")");
                } else {
                    process(object.getSecondValue());
                }
            }
            return DONE;
        }

        @Override
        public String caseBehaviorPropertyConstant(BehaviorPropertyConstant object) {
            aadlbaText.addOutput("#");
            if (object.getPropertySet() != null) {
                aadlbaText.addOutput(object.getPropertySet().getQualifiedName());
                aadlbaText.addOutput("::");
            }
            aadlbaText.addOutput(object.getProperty().getName());
            return DONE;
        }

        @Override
        public String casePropertySetPropertyReference(PropertySetPropertyReference object) {
            aadlbaText.addOutput("#");
            if (object.getPropertySet() != null) {
                aadlbaText.addOutput(object.getPropertySet().getQualifiedName());
                aadlbaText.addOutput("::");
            }
            processEList(object.getProperties(), ".");
            return DONE;
        }

        @Override
        public String caseClassifierPropertyReference(ClassifierPropertyReference object) {
            org.osate.aadl2.Classifier c = object.getClassifier();
            process(c, object);
            aadlbaText.addOutput("#");
            processEList(object.getProperties(), ".");
            return DONE;
        }

        @Override
        public String caseClassifierFeaturePropertyReference(ClassifierFeaturePropertyReference object) {
            process(object.getComponent());
            aadlbaText.addOutput("#");
            processEList(object.getProperties(), ".");
            return DONE;
        }

        @Override
        public String casePropertyNameHolder(PropertyNameHolder pnh) {
            PropertyElementHolder peh = pnh.getProperty();
            Element el = peh.getElement();
            if (el instanceof NamedElement) {
                aadlbaText.addOutput(((NamedElement) el).getName());
            } else if (el instanceof PropertyAssociation) {
                aadlbaText.addOutput(((PropertyAssociation) el).getProperty().getName());
            } else {
                String tmp = unparse((PropertyExpression) el);
                aadlbaText.addOutput(tmp);
            }
            if (pnh.getField() != null) {
                aadlbaText.addOutput(".");
                process(pnh.getField());
            } else if (peh.isSetArrayIndexes()) {
                caseArrayIndex(peh.getArrayIndexes());
            }
            return DONE;
        }

        @Override
        public String caseUpperBound(UpperBound object) {
            aadlbaText.addOutput("upper_bound");
            return DONE;
        }

        @Override
        public String caseLowerBound(LowerBound object) {
            aadlbaText.addOutput("lower_bound");
            return DONE;
        }
    };
}
Also used : ExecutionTimeoutCatch(org.osate.ba.aadlba.ExecutionTimeoutCatch) SubprogramCallAction(org.osate.ba.aadlba.SubprogramCallAction) BehaviorTime(org.osate.ba.aadlba.BehaviorTime) ClassifierPropertyReference(org.osate.ba.aadlba.ClassifierPropertyReference) DeclarativeBehaviorTransition(org.osate.ba.declarative.DeclarativeBehaviorTransition) DispatchTriggerLogicalExpression(org.osate.ba.aadlba.DispatchTriggerLogicalExpression) GroupableElement(org.osate.ba.aadlba.GroupableElement) TimedAction(org.osate.ba.aadlba.TimedAction) BehaviorIntegerLiteral(org.osate.ba.aadlba.BehaviorIntegerLiteral) BehaviorTransition(org.osate.ba.aadlba.BehaviorTransition) DeclarativeBehaviorTransition(org.osate.ba.declarative.DeclarativeBehaviorTransition) ArrayableIdentifier(org.osate.ba.declarative.ArrayableIdentifier) DataComponentReference(org.osate.ba.aadlba.DataComponentReference) SimpleExpression(org.osate.ba.aadlba.SimpleExpression) DispatchTriggerConditionStop(org.osate.ba.aadlba.DispatchTriggerConditionStop) IfStatement(org.osate.ba.aadlba.IfStatement) DataSubcomponentHolder(org.osate.ba.aadlba.DataSubcomponentHolder) QualifiedNamedElement(org.osate.ba.declarative.QualifiedNamedElement) Otherwise(org.osate.ba.aadlba.Otherwise) Identifier(org.osate.ba.declarative.Identifier) ArrayableIdentifier(org.osate.ba.declarative.ArrayableIdentifier) AbstractEnumerator(org.eclipse.emf.common.util.AbstractEnumerator) Enumerator(org.eclipse.emf.common.util.Enumerator) PortFreezeAction(org.osate.ba.aadlba.PortFreezeAction) UpperBound(org.osate.ba.aadlba.UpperBound) EObject(org.eclipse.emf.ecore.EObject) Factor(org.osate.ba.aadlba.Factor) PropertySetPropertyReference(org.osate.ba.aadlba.PropertySetPropertyReference) BehaviorState(org.osate.ba.aadlba.BehaviorState) BehaviorActionSet(org.osate.ba.aadlba.BehaviorActionSet) BinaryNumericOperator(org.osate.ba.aadlba.BinaryNumericOperator) ForOrForAllStatement(org.osate.ba.aadlba.ForOrForAllStatement) PropertyElementHolder(org.osate.ba.aadlba.PropertyElementHolder) IterativeVariable(org.osate.ba.aadlba.IterativeVariable) BehaviorAnnex(org.osate.ba.aadlba.BehaviorAnnex) AssignmentAction(org.osate.ba.aadlba.AssignmentAction) PortDequeueAction(org.osate.ba.aadlba.PortDequeueAction) LogicalOperator(org.osate.ba.aadlba.LogicalOperator) PortDequeueValue(org.osate.ba.aadlba.PortDequeueValue) ElementHolder(org.osate.ba.aadlba.ElementHolder) PropertyElementHolder(org.osate.ba.aadlba.PropertyElementHolder) Term(org.osate.ba.aadlba.Term) DeclarativeTime(org.osate.ba.declarative.DeclarativeTime) PortSendAction(org.osate.ba.aadlba.PortSendAction) DispatchCondition(org.osate.ba.aadlba.DispatchCondition) ElseStatement(org.osate.ba.aadlba.ElseStatement) BehaviorBooleanLiteral(org.osate.ba.aadlba.BehaviorBooleanLiteral) MultiplyingOperator(org.osate.ba.aadlba.MultiplyingOperator) LockAction(org.osate.ba.aadlba.LockAction) QualifiedNamedElement(org.osate.ba.declarative.QualifiedNamedElement) NamedElement(org.osate.aadl2.NamedElement) CompletionRelativeTimeout(org.osate.ba.aadlba.CompletionRelativeTimeout) IndexableElement(org.osate.ba.aadlba.IndexableElement) DispatchConjunction(org.osate.ba.aadlba.DispatchConjunction) LowerBound(org.osate.ba.aadlba.LowerBound) BehaviorVariable(org.osate.ba.aadlba.BehaviorVariable) PropertyAssociation(org.osate.aadl2.PropertyAssociation) QualifiedNamedElement(org.osate.ba.declarative.QualifiedNamedElement) NamedElement(org.osate.aadl2.NamedElement) Element(org.osate.aadl2.Element) BehaviorElement(org.osate.ba.aadlba.BehaviorElement) IndexableElement(org.osate.ba.aadlba.IndexableElement) GroupableElement(org.osate.ba.aadlba.GroupableElement) WhileOrDoUntilStatement(org.osate.ba.aadlba.WhileOrDoUntilStatement) PortHolder(org.osate.ba.aadlba.PortHolder) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) NamedValue(org.osate.aadl2.NamedValue) DataClassifier(org.osate.aadl2.DataClassifier) DataClassifier(org.osate.aadl2.DataClassifier) Any(org.osate.ba.aadlba.Any) DeclarativePropertyName(org.osate.ba.declarative.DeclarativePropertyName) PortCountValue(org.osate.ba.aadlba.PortCountValue) Relation(org.osate.ba.aadlba.Relation) BehaviorPropertyConstant(org.osate.ba.aadlba.BehaviorPropertyConstant) DeclarativeArrayDimension(org.osate.ba.declarative.DeclarativeArrayDimension) ClassifierFeaturePropertyReference(org.osate.ba.aadlba.ClassifierFeaturePropertyReference) BehaviorStringLiteral(org.osate.ba.aadlba.BehaviorStringLiteral) BehaviorRealLiteral(org.osate.ba.aadlba.BehaviorRealLiteral) Iterator(java.util.Iterator) BehaviorActionBlock(org.osate.ba.aadlba.BehaviorActionBlock) DeclarativePropertyReference(org.osate.ba.declarative.DeclarativePropertyReference) SharedDataAction(org.osate.ba.aadlba.SharedDataAction) CommAction(org.osate.ba.declarative.CommAction) IntegerRange(org.osate.ba.aadlba.IntegerRange) DeclarativePropertyReference(org.osate.ba.declarative.DeclarativePropertyReference) PropertySetPropertyReference(org.osate.ba.aadlba.PropertySetPropertyReference) ClassifierFeaturePropertyReference(org.osate.ba.aadlba.ClassifierFeaturePropertyReference) ClassifierPropertyReference(org.osate.ba.aadlba.ClassifierPropertyReference) Reference(org.osate.ba.declarative.Reference) DataComponentReference(org.osate.ba.aadlba.DataComponentReference) IntegerValue(org.osate.ba.aadlba.IntegerValue) PortFreshValue(org.osate.ba.aadlba.PortFreshValue) DispatchRelativeTimeout(org.osate.ba.aadlba.DispatchRelativeTimeout) PropertyNameHolder(org.osate.ba.aadlba.PropertyNameHolder) UnlockAction(org.osate.ba.aadlba.UnlockAction) ValueExpression(org.osate.ba.aadlba.ValueExpression) BinaryAddingOperator(org.osate.ba.aadlba.BinaryAddingOperator) BehaviorActionSequence(org.osate.ba.aadlba.BehaviorActionSequence) ArrayDimension(org.osate.aadl2.ArrayDimension) DeclarativeArrayDimension(org.osate.ba.declarative.DeclarativeArrayDimension)

Example 4 with Factor

use of org.osate.ba.aadlba.Factor in project osate2 by osate.

the class AadlBaParserVisitor method visitTerm.

/**
 * {@inheritDoc}
 * <p/>
 * The default implementation returns the result of calling
 * {@link #visitChildren} on {@code ctx}.
 */
@Override
public T visitTerm(@NotNull AadlBaParser.TermContext ctx) {
    visitChildren(ctx);
    ctx.result = _baFact.createTerm();
    Iterator<FactorContext> factIt = ctx.factor().iterator();
    Factor tmpFact = factIt.next().result;
    ctx.result.getFactors().add(tmpFact);
    ctx.result.setLocationReference(tmpFact.getLocationReference());
    for (Multiplying_operatorContext mec : ctx.multiplying_operator()) {
        ctx.result.getMultiplyingOperators().add(mec.result);
        tmpFact = factIt.next().result;
        ctx.result.getFactors().add(tmpFact);
    }
    return null;
}
Also used : Factor(org.osate.ba.aadlba.Factor) Multiplying_operatorContext(org.osate.ba.parser.AadlBaParser.Multiplying_operatorContext) FactorContext(org.osate.ba.parser.AadlBaParser.FactorContext)

Example 5 with Factor

use of org.osate.ba.aadlba.Factor in project osate2 by osate.

the class AadlBaNameResolver method valueExpressionResolver.

private boolean valueExpressionResolver(ValueExpression expr) {
    boolean result = true;
    int seNb = 0;
    SimpleExpression se;
    Value v;
    int vNb = 0;
    // Iterates over relations.
    for (Relation r : expr.getRelations()) {
        se = r.getFirstExpression();
        // Treats simple expression(s).
        do {
            // Iterates over Terms.
            for (Term t : se.getTerms()) {
                // Iterate over Factors.
                for (Factor f : t.getFactors()) {
                    v = f.getFirstValue();
                    // Treats value(s).
                    do {
                        result &= valueResolver(v);
                        v = f.getSecondValue();
                        vNb++;
                    } while (v != null && vNb != 2);
                    vNb = 0;
                }
            // End of for factors.
            }
            // End of for terms.
            se = r.getSecondExpression();
            seNb++;
        } while (se != null && seNb != 2);
        seNb = 0;
    }
    return result;
}
Also used : Relation(org.osate.ba.aadlba.Relation) Factor(org.osate.ba.aadlba.Factor) ListValue(org.osate.aadl2.ListValue) IntegerValue(org.osate.ba.aadlba.IntegerValue) NamedValue(org.osate.ba.declarative.NamedValue) NumberValue(org.osate.aadl2.NumberValue) ClassifierValue(org.osate.aadl2.ClassifierValue) RangeValue(org.osate.aadl2.RangeValue) RecordValue(org.osate.aadl2.RecordValue) ReferenceValue(org.osate.aadl2.ReferenceValue) DeclarativeListValue(org.osate.ba.declarative.DeclarativeListValue) ModalPropertyValue(org.osate.aadl2.ModalPropertyValue) Value(org.osate.ba.aadlba.Value) Term(org.osate.ba.aadlba.Term) SimpleExpression(org.osate.ba.aadlba.SimpleExpression)

Aggregations

Factor (org.osate.ba.aadlba.Factor)6 BinaryNumericOperator (org.osate.ba.aadlba.BinaryNumericOperator)3 IntegerValue (org.osate.ba.aadlba.IntegerValue)3 Relation (org.osate.ba.aadlba.Relation)3 SimpleExpression (org.osate.ba.aadlba.SimpleExpression)3 Term (org.osate.ba.aadlba.Term)3 ClassifierValue (org.osate.aadl2.ClassifierValue)2 ListValue (org.osate.aadl2.ListValue)2 ModalPropertyValue (org.osate.aadl2.ModalPropertyValue)2 NamedValue (org.osate.aadl2.NamedValue)2 RangeValue (org.osate.aadl2.RangeValue)2 BehaviorPropertyConstant (org.osate.ba.aadlba.BehaviorPropertyConstant)2 Value (org.osate.ba.aadlba.Value)2 Iterator (java.util.Iterator)1 AbstractEnumerator (org.eclipse.emf.common.util.AbstractEnumerator)1 Enumerator (org.eclipse.emf.common.util.Enumerator)1 EObject (org.eclipse.emf.ecore.EObject)1 AbstractNamedValue (org.osate.aadl2.AbstractNamedValue)1 ArrayDimension (org.osate.aadl2.ArrayDimension)1 DataClassifier (org.osate.aadl2.DataClassifier)1