org.osate.ba.parser.AadlBaParserVisitor.java Source code

Java tutorial

Introduction

Here is the source code for org.osate.ba.parser.AadlBaParserVisitor.java

Source

/**
 * AADL-BA-FrontEnd
 * 
 * Copyright  2013 TELECOM ParisTech and CNRS
 * 
 * TELECOM ParisTech/LTCI
 * 
 * Authors: see AUTHORS
 * 
 * This program is free software: you can redistribute it and/or modify 
 * it under the terms of the Eclipse Public License as published by Eclipse,
 * either version 1.0 of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * Eclipse Public License for more details.
 * You should have received a copy of the Eclipse Public License
 * along with this program.  If not, see 
 * http://www.eclipse.org/org/documents/epl-v10.php
 */

package org.osate.ba.parser;

import java.util.Iterator;

import org.antlr.v4.runtime.CommonToken;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.eclipse.emf.common.util.BasicEList;
import org.osate.aadl2.ProcessorClassifier;
import org.osate.aadl2.parsesupport.AObject;
import org.osate.ba.aadlba.AadlBaFactory;
import org.osate.ba.aadlba.Any;
import org.osate.ba.aadlba.BehaviorActionCollection;
import org.osate.ba.aadlba.BehaviorActions;
import org.osate.ba.aadlba.BehaviorAnnex;
import org.osate.ba.aadlba.BehaviorIntegerLiteral;
import org.osate.ba.aadlba.BehaviorRealLiteral;
import org.osate.ba.aadlba.BehaviorState;
import org.osate.ba.aadlba.BinaryAddingOperator;
import org.osate.ba.aadlba.BinaryNumericOperator;
import org.osate.ba.aadlba.ElementValues;
import org.osate.ba.aadlba.ElseStatement;
import org.osate.ba.aadlba.Factor;
import org.osate.ba.aadlba.IfStatement;
import org.osate.ba.aadlba.IntegerValue;
import org.osate.ba.aadlba.IterativeVariable;
import org.osate.ba.aadlba.LogicalOperator;
import org.osate.ba.aadlba.LowerBound;
import org.osate.ba.aadlba.MultiplyingOperator;
import org.osate.ba.aadlba.ParameterLabel;
import org.osate.ba.aadlba.Relation;
import org.osate.ba.aadlba.RelationalOperator;
import org.osate.ba.aadlba.Term;
import org.osate.ba.aadlba.UnaryAddingOperator;
import org.osate.ba.aadlba.UnaryBooleanOperator;
import org.osate.ba.aadlba.UnaryNumericOperator;
import org.osate.ba.aadlba.UpperBound;
import org.osate.ba.aadlba.Value;
import org.osate.ba.analyzers.DeclarativeUtils;
import org.osate.ba.declarative.DeclarativeArrayDimension;
import org.osate.ba.declarative.DeclarativeFactory;
import org.osate.ba.declarative.DeclarativePropertyName;
import org.osate.ba.declarative.DeclarativePropertyReference;
import org.osate.ba.declarative.Identifier;
import org.osate.ba.declarative.NamedValue;
import org.osate.ba.declarative.QualifiedNamedElement;
import org.osate.ba.declarative.Reference;
import org.osate.ba.parser.AadlBaParser.Array_identifierContext;
import org.osate.ba.parser.AadlBaParser.Behavior_actionContext;
import org.osate.ba.parser.AadlBaParser.Behavior_state_listContext;
import org.osate.ba.parser.AadlBaParser.Behavior_transitionContext;
import org.osate.ba.parser.AadlBaParser.Behavior_variableContext;
import org.osate.ba.parser.AadlBaParser.Behavior_variable_listContext;
import org.osate.ba.parser.AadlBaParser.Binary_adding_operatorContext;
import org.osate.ba.parser.AadlBaParser.Dispatch_conjunctionContext;
import org.osate.ba.parser.AadlBaParser.Elsif_statementContext;
import org.osate.ba.parser.AadlBaParser.FactorContext;
import org.osate.ba.parser.AadlBaParser.In_bindingContext;
import org.osate.ba.parser.AadlBaParser.Integer_valueContext;
import org.osate.ba.parser.AadlBaParser.Integer_value_constantContext;
import org.osate.ba.parser.AadlBaParser.Logical_operatorContext;
import org.osate.ba.parser.AadlBaParser.Multiplying_operatorContext;
import org.osate.ba.parser.AadlBaParser.Parameter_labelContext;
import org.osate.ba.parser.AadlBaParser.Property_nameContext;
import org.osate.ba.parser.AadlBaParser.Property_referenceContext;
import org.osate.ba.parser.AadlBaParser.Real_literalContext;
import org.osate.ba.parser.AadlBaParser.ReferenceContext;
import org.osate.ba.parser.AadlBaParser.RelationContext;
import org.osate.ba.parser.AadlBaParser.TermContext;
import org.osate.ba.parser.AadlBaParser.Unique_component_classifier_referenceContext;
import org.osate.ba.parser.AadlBaParser.ValueContext;
import org.osate.ba.parser.AadlBaParser.Value_constantContext;
import org.osate.ba.utils.AadlBaLocationReference;

/**
 * This class provides an empty implementation of {@link AadlBaVisitor},
 * which can be extended to create a visitor which only needs to handle a subset
 * of the available methods.
 *
 * @param <T> The return type of the visit operation. Use {@link Void} for
 * operations with no return type.
 */
public class AadlBaParserVisitor<T> extends AbstractParseTreeVisitor<T> implements AadlBaVisitor<T> {
    protected BehaviorAnnex _ba = null;

    protected AadlBaFactory _fact = AadlBaFactory.eINSTANCE;

    protected DeclarativeFactory _decl = DeclarativeFactory.eINSTANCE;

    protected String _filename;

    protected final static String behaviorElementId = "";

    protected int _annexOffset = 0;

    public AadlBaParserVisitor(String filename, int annexOffset) {
        _filename = filename;
        _annexOffset = annexOffset;
    }

    /**
     * Sets obj's location reference based on full token informations.
     *
     * @param obj the AObject to be set
     * @param src the token 
     */
    protected void setLocationReference(AObject obj, Token token) {
        int offset = ((CommonToken) token).getStartIndex();
        int length = token.getText().length();
        int column = token.getCharPositionInLine() + 1; // Zero index based.
        int line = token.getLine();

        AadlBaLocationReference location = new AadlBaLocationReference(_annexOffset, _filename, line, offset,
                length, column, behaviorElementId);

        obj.setLocationReference(location);
    }

    protected void setLocationReference(AObject obj, TerminalNode node) {
        setLocationReference(obj, node.getSymbol());
    }

    public void setAnnexOffset(int offset) {
        _annexOffset = offset;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitNumeral(@NotNull AadlBaParser.NumeralContext ctx) {
        String tmp = ctx.INTEGER_LIT().getText();
        tmp = tmp.replaceAll("_", "");
        ctx.result = new Integer(Integer.parseInt(tmp));
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitUnary_boolean_operator(@NotNull AadlBaParser.Unary_boolean_operatorContext ctx) {
        ctx.result = UnaryBooleanOperator.NOT;
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitDispatch_condition(@NotNull AadlBaParser.Dispatch_conditionContext ctx) {
        visitChildren(ctx);

        // Location reference is set in behavior_condition
        ctx.result = _fact.createDispatchCondition();

        if (ctx.dispatch_trigger_condition() != null) {
            ctx.result.setDispatchTriggerCondition(ctx.dispatch_trigger_condition().result);
        }

        if (ctx.FROZEN() != null) {
            for (ReferenceContext rc : ctx.reference()) {
                ctx.result.getFrozenPorts().add(rc.result);
            }
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitDispatch_conjunction(@NotNull AadlBaParser.Dispatch_conjunctionContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createDispatchConjunction();

        ctx.result.setLocationReference(ctx.reference(0).result.getLocationReference());

        for (ReferenceContext rc : ctx.reference()) {
            ctx.result.getDispatchTriggers().add(rc.result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitDispatch_trigger_logical_expression(
            @NotNull AadlBaParser.Dispatch_trigger_logical_expressionContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createDispatchTriggerLogicalExpression();

        ctx.result.setLocationReference(ctx.dispatch_conjunction(0).result.getLocationReference());

        for (Dispatch_conjunctionContext dcc : ctx.dispatch_conjunction()) {
            ctx.result.getDispatchConjunctions().add(dcc.result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitValue(@NotNull AadlBaParser.ValueContext ctx) {
        visitChildren(ctx);

        if (ctx.value_constant() != null) {
            ctx.result = ctx.value_constant().result;
        } else if (ctx.value_variable() != null) {
            ctx.result = ctx.value_variable().result;
        } else {
            ctx.result = ctx.value_expression().result;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitFor_statement(@NotNull AadlBaParser.For_statementContext ctx) {
        visitChildren(ctx);
        ctx.result = ctx.for_condition().result;
        ctx.result.setBehaviorActions(ctx.behavior_actions().result);
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_variable_list(@NotNull AadlBaParser.Behavior_variable_listContext ctx) {
        visitChildren(ctx);

        DeclarativeUtils.setEcontainer(ctx.ba, ctx.unique_component_classifier_reference().result);

        for (Behavior_variableContext bvc : ctx.behavior_variable()) {
            bvc.result.setDataClassifier(ctx.unique_component_classifier_reference().result);

            ctx.ba.getVariables().add(bvc.result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitParameter_label(@NotNull AadlBaParser.Parameter_labelContext ctx) {
        visitChildren(ctx);
        ctx.result = ctx.value_expression().result;
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitRelation(@NotNull AadlBaParser.RelationContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createRelation();

        ctx.result.setFirstExpression(ctx.simple_expression(0).result);
        ctx.result.setLocationReference(ctx.simple_expression(0).result.getLocationReference());
        if (ctx.relational_operator() != null) {
            ctx.result.setRelationalOperator(ctx.relational_operator().result);
            ctx.result.setSecondExpression(ctx.simple_expression(1).result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBinary_numeric_operator(@NotNull AadlBaParser.Binary_numeric_operatorContext ctx) {
        ctx.result = BinaryNumericOperator.MULTIPLY_MULTIPLY;
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitSubprogram_parameter_list(@NotNull AadlBaParser.Subprogram_parameter_listContext ctx) {
        visitChildren(ctx);

        ctx.result = new BasicEList<ParameterLabel>();

        for (Parameter_labelContext plc : ctx.parameter_label()) {
            ctx.result.add(plc.result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitMultiplying_operator(@NotNull AadlBaParser.Multiplying_operatorContext ctx) {
        if (ctx.STAR() != null) {
            ctx.result = MultiplyingOperator.MULTIPLY;
        } else if (ctx.DIVIDE() != null) {
            ctx.result = MultiplyingOperator.DIVIDE;
        } else if (ctx.MOD() != null) {
            ctx.result = MultiplyingOperator.MOD;
        } else {
            ctx.result = MultiplyingOperator.REM;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitDispatch_trigger_condition(@NotNull AadlBaParser.Dispatch_trigger_conditionContext ctx) {
        visitChildren(ctx);

        if (ctx.dispatch_trigger_logical_expression() != null) {
            ctx.result = ctx.dispatch_trigger_logical_expression().result;
        } else if (ctx.TIMEOUT() != null) {
            if (ctx.behavior_time() != null) {
                ctx.result = ctx.behavior_time().result;
            } else {
                ctx.result = _fact.createDispatchRelativeTimeout();
                setLocationReference(ctx.result, ctx.TIMEOUT());
            }
        } else {
            ctx.result = _fact.createDispatchTriggerConditionStop();
            setLocationReference(ctx.result, ctx.STOP());
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBinary_adding_operator(@NotNull AadlBaParser.Binary_adding_operatorContext ctx) {
        if (ctx.PLUS() != null) {
            ctx.result = BinaryAddingOperator.PLUS;
        } else {
            ctx.result = BinaryAddingOperator.MINUS;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_action(@NotNull AadlBaParser.Behavior_actionContext ctx) {
        visitChildren(ctx);

        if (ctx.basic_action() != null) {
            ctx.result = ctx.basic_action().result;
        } else if (ctx.if_statement() != null) {
            ctx.result = ctx.if_statement().result;
        } else if (ctx.for_statement() != null) {
            ctx.result = ctx.for_statement().result;
        } else if (ctx.while_statement() != null) {
            ctx.result = ctx.while_statement().result;
        } else if (ctx.dountil_statement() != null) {
            ctx.result = ctx.dountil_statement().result;
        } else if (ctx.behavior_action_block() != null) {
            ctx.result = ctx.behavior_action_block().result;
        } else {
            ctx.result = ctx.forall_statement().result;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitAssignment_action(@NotNull AadlBaParser.Assignment_actionContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createAssignmentAction();
        ctx.result.setLocationReference(ctx.target().result.getLocationReference());
        ctx.result.setTarget(ctx.target().result);

        if (ctx.value_expression() != null) {
            ctx.result.setValueExpression(ctx.value_expression().result);
        } else {
            Any any = _fact.createAny();
            setLocationReference(any, ctx.ANY());
            ctx.result.setValueExpression(any);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitLogical_operator(@NotNull AadlBaParser.Logical_operatorContext ctx) {
        if (ctx.AND() != null) {
            ctx.result = LogicalOperator.AND;
        } else if (ctx.OR() != null) {
            ctx.result = LogicalOperator.OR;
        } else {
            ctx.result = LogicalOperator.XOR;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitCommunication_action(@NotNull AadlBaParser.Communication_actionContext ctx) {
        visitChildren(ctx);

        ctx.result = _decl.createCommAction();

        if (ctx.reference() != null) {
            ctx.result.setReference(ctx.reference().result);
            ctx.result.setLocationReference(ctx.reference().result.getLocationReference());

            if (ctx.INTERROG() != null) {
                ctx.result.setPortDequeue(true);

                if (ctx.target() != null) {
                    ctx.result.setTarget(ctx.target().result);
                }
            } else if (ctx.GGREATER() != null) {
                ctx.result.setPortFreeze(true);
            } else if (ctx.EXCLLESS() != null) {
                ctx.result.setLock(true);
            } else if (ctx.EXCLGREATER() != null) {
                ctx.result.setUnlock(true);
            } else {
                if (ctx.subprogram_parameter_list() != null) {
                    ctx.result.getParameters().addAll(ctx.subprogram_parameter_list().result);
                }
            }
        } else if (ctx.qualified_named_element() != null) {
            ctx.result.setLocationReference(ctx.qualified_named_element().result.getLocationReference());
            ctx.result.setQualifiedName(ctx.qualified_named_element().result);

            if (ctx.subprogram_parameter_list() != null) {
                ctx.result.getParameters().addAll(ctx.subprogram_parameter_list().result);
            }
        } else {
            if (ctx.EXCLLESS() != null) {
                ctx.result.setLock(true);
            } else {
                ctx.result.setUnlock(true);
            }

            setLocationReference(ctx.result, ctx.STAR());
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_action_block(@NotNull AadlBaParser.Behavior_action_blockContext ctx) {
        visitChildren(ctx);

        ctx.result = ctx.action_block().result;

        if (ctx.TIMEOUT() != null) {
            ctx.result.setTimeout(ctx.behavior_time().result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitValue_variable(@NotNull AadlBaParser.Value_variableContext ctx) {
        visitChildren(ctx);

        Reference tmp = ctx.reference().result;

        if (ctx.TICK() != null) {
            if (ctx.COUNT() != null) {
                NamedValue nv = _decl.createNamedValue();
                nv.setReference(tmp);
                nv.setCount(true);
                nv.setLocationReference(tmp.getLocationReference());
                ctx.result = nv;
            } else {
                NamedValue nv = _decl.createNamedValue();
                nv.setReference(tmp);
                nv.setFresh(true);
                nv.setLocationReference(tmp.getLocationReference());
                ctx.result = nv;
            }
        } else if (ctx.INTERROG() != null) {
            NamedValue nv = _decl.createNamedValue();
            nv.setReference(tmp);
            nv.setDequeue(true);
            nv.setLocationReference(tmp.getLocationReference());
            ctx.result = nv;
        } else {
            ctx.result = tmp;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitQualifiable_named_element(@NotNull AadlBaParser.Qualifiable_named_elementContext ctx) {
        Identifier nameId = _decl.createIdentifier();
        nameId.setId(ctx.id2);
        setLocationReference(nameId, ctx.identifier2);
        ctx.result.setBaName(nameId);

        if (!ctx.id1.equals("")) {
            Identifier nameSpaceId = _decl.createIdentifier();
            nameSpaceId.setId(ctx.id1);
            setLocationReference(nameSpaceId, ctx.identifier1);
            ctx.result.setBaNamespace(nameSpaceId);
            setLocationReference(ctx.result, ctx.identifier1);
        } else {
            setLocationReference(ctx.result, ctx.identifier2);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitInteger_literal(@NotNull AadlBaParser.Integer_literalContext ctx) {
        String str = ctx.INTEGER_LIT().getText();
        BehaviorIntegerLiteral tmp = _fact.createBehaviorIntegerLiteral();
        tmp.setValue(str);
        setLocationReference(tmp, ctx.INTEGER_LIT());
        ctx.result = tmp;

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitString_literal(@NotNull AadlBaParser.String_literalContext ctx) {
        ctx.result = _fact.createBehaviorStringLiteral();
        String str = ctx.STRING_LITERAL().getText();
        // stripout the quotes
        ctx.result.setValue(str.substring(1, str.length() - 1));
        setLocationReference(ctx.result, ctx.STRING_LITERAL());
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitUnary_numeric_operator(@NotNull AadlBaParser.Unary_numeric_operatorContext ctx) {
        ctx.result = UnaryNumericOperator.ABS;
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitQualified_named_element(@NotNull AadlBaParser.Qualified_named_elementContext ctx) {
        ctx.result = _decl.createQualifiedNamedElement();
        Identifier nameId = _decl.createIdentifier();
        nameId.setId(ctx.nameId);
        setLocationReference(nameId, ctx.id2);
        ctx.result.setBaName(nameId);

        if (ctx.id1 != null) {
            Identifier nameSpaceId = _decl.createIdentifier();
            nameSpaceId.setId(ctx.namespaceId);
            setLocationReference(nameSpaceId, ctx.id1);
            ctx.result.setBaNamespace(nameSpaceId);
            setLocationReference(ctx.result, ctx.id1);
        } else {
            setLocationReference(ctx.result, ctx.id2);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBoolean_literal(@NotNull AadlBaParser.Boolean_literalContext ctx) {
        ctx.result = _fact.createBehaviorBooleanLiteral();

        TerminalNode node = null;

        if (ctx.TRUE() != null) {
            ctx.result.setValue(true);
            node = ctx.TRUE();
        } else {
            ctx.result.setValue(false);
            node = ctx.FALSE();
        }

        setLocationReference(ctx.result, node);

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitAction_block(@NotNull AadlBaParser.Action_blockContext ctx) {
        visitChildren(ctx);
        ctx.result = _fact.createBehaviorActionBlock();
        ctx.result.setContent(ctx.behavior_actions().result);
        setLocationReference(ctx.result, ctx.LCURLY(0));
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitDountil_statement(@NotNull AadlBaParser.Dountil_statementContext ctx) {
        visitChildren(ctx);
        ctx.result = _fact.createWhileOrDoUntilStatement();
        setLocationReference(ctx.result, ctx.DO());
        ctx.result.setDoUntil(true);
        ctx.result.setBehaviorActions(ctx.behavior_actions().result);
        ctx.result.setLogicalValueExpression(ctx.value_expression().result);
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitArray_identifier(@NotNull AadlBaParser.Array_identifierContext ctx) {
        visitChildren(ctx);

        ctx.result = _decl.createArrayableIdentifier();
        ctx.result.setId(ctx.IDENT().getText());
        setLocationReference(ctx.result, ctx.IDENT());

        if (!ctx.integer_value().isEmpty()) {
            for (Integer_valueContext ivc : ctx.integer_value()) {
                ctx.result.getArrayIndexes().add(ivc.result);
            }
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitIf_statement(@NotNull AadlBaParser.If_statementContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createIfStatement();
        setLocationReference(ctx.result, ctx.IF(0));
        ctx.result.setLogicalValueExpression(ctx.value_expression().result);
        ctx.result.setBehaviorActions(ctx.behavior_actions(0).result);

        IfStatement previousState = ctx.result;

        if (!ctx.elsif_statement().isEmpty()) {
            IfStatement elsifStat = null;

            for (Elsif_statementContext isc : ctx.elsif_statement()) {
                elsifStat = isc.result;
                previousState.setElseStatement(elsifStat);
                previousState = elsifStat;
            }
        }

        if (ctx.ELSE() != null) {
            ElseStatement elseStat = _fact.createElseStatement();
            setLocationReference(elseStat, ctx.ELSE());
            elseStat.setBehaviorActions(ctx.behavior_actions(1).result);
            previousState.setElseStatement(elseStat);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitWhile_statement(@NotNull AadlBaParser.While_statementContext ctx) {
        visitChildren(ctx);
        ctx.result = ctx.while_condition().result;
        ctx.result.setBehaviorActions(ctx.behavior_actions().result);
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_state_list(@NotNull AadlBaParser.Behavior_state_listContext ctx) {
        visitChildren(ctx);

        BehaviorState bs = null;

        for (TerminalNode bsId : ctx.IDENT()) {
            bs = _fact.createBehaviorState();

            bs.setName(bsId.getText());

            setLocationReference(bs, bsId);

            if (ctx.INITIAL() != null) {
                bs.setInitial(true);
                ctx.ba.setInitialState(bs);
            }

            if (ctx.COMPLETE() != null) {
                bs.setComplete(true);
            }

            if (ctx.FINAL() != null) {
                bs.setFinal(true);
            }

            ctx.ba.getStates().add(bs);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitTimed_action(@NotNull AadlBaParser.Timed_actionContext ctx) {
        ctx.result = _fact.createTimedAction();
        setLocationReference(ctx.result, ctx.COMPUTATION());

        if (ctx.in_binding() != null) {
            ctx.in_binding().ta = ctx.result;
        }

        visitChildren(ctx);

        ctx.result.setLowerTime(ctx.behavior_time(0).result);

        if (ctx.behavior_time().size() == 2) {
            ctx.result.setUpperTime(ctx.behavior_time(1).result);
        }

        return null;
    }

    @Override
    public T visitProcessor_parameter_list(@NotNull AadlBaParser.Processor_parameter_listContext ctx) {
        visitChildren(ctx);

        ctx.result = new BasicEList<ProcessorClassifier>();

        for (Unique_component_classifier_referenceContext uccrc : ctx.unique_component_classifier_reference()) {
            DeclarativeUtils.setEcontainer(_ba, uccrc.result);
            ctx.result.add(uccrc.result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitForall_condition(@NotNull AadlBaParser.Forall_conditionContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createForOrForAllStatement();
        ctx.result.setForAll(true);
        setLocationReference(ctx.result, ctx.FORALL());

        IterativeVariable itVar = _fact.createIterativeVariable();
        itVar.setName(ctx.IDENT().getText());
        setLocationReference(itVar, ctx.IDENT());
        ctx.result.setIterativeVariable(itVar);

        DeclarativeUtils.setEcontainer(_ba, ctx.unique_component_classifier_reference().result);
        itVar.setDataClassifier(ctx.unique_component_classifier_reference().result);

        ctx.result.setIteratedValues(ctx.element_values().result);
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBasic_action(@NotNull AadlBaParser.Basic_actionContext ctx) {
        visitChildren(ctx);

        if (ctx.assignment_action() != null) {
            ctx.result = ctx.assignment_action().result;
        } else if (ctx.communication_action() != null) {
            ctx.result = ctx.communication_action().result;
        } else {
            ctx.result = ctx.timed_action().result;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitSimple_expression(@NotNull AadlBaParser.Simple_expressionContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createSimpleExpression();

        if (ctx.unary_adding_operator() != null) {
            ctx.result.setUnaryAddingOperator(ctx.unary_adding_operator().result);
        }

        Iterator<TermContext> termIt = ctx.term().iterator();
        Term tmp = termIt.next().result;
        ctx.result.getTerms().add(tmp);
        ctx.result.setLocationReference(tmp.getLocationReference());

        for (Binary_adding_operatorContext op : ctx.binary_adding_operator()) {
            tmp = termIt.next().result;
            ctx.result.getTerms().add(tmp);
            ctx.result.getBinaryAddingOperators().add(op.result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitFor_condition(@NotNull AadlBaParser.For_conditionContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createForOrForAllStatement();
        ctx.result.setForAll(false);
        setLocationReference(ctx.result, ctx.FOR());

        IterativeVariable itVar = _fact.createIterativeVariable();
        itVar.setName(ctx.IDENT().getText());
        setLocationReference(itVar, ctx.IDENT());
        ctx.result.setIterativeVariable(itVar);

        DeclarativeUtils.setEcontainer(_ba, ctx.unique_component_classifier_reference().result);
        itVar.setDataClassifier(ctx.unique_component_classifier_reference().result);

        ctx.result.setIteratedValues(ctx.element_values().result);
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_time(@NotNull AadlBaParser.Behavior_timeContext ctx) {
        visitChildren(ctx);

        ctx.result = _decl.createDeclarativeTime();
        ctx.result.setIntegerValue(ctx.integer_value().result);
        ctx.result.setLocationReference(ctx.integer_value().result.getLocationReference());
        Identifier id = _decl.createIdentifier();
        id.setId(ctx.IDENT().getText());
        setLocationReference(id, ctx.IDENT());
        ctx.result.setUnitId(id);
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitUnary_adding_operator(@NotNull AadlBaParser.Unary_adding_operatorContext ctx) {
        if (ctx.PLUS() != null) {
            ctx.result = UnaryAddingOperator.PLUS;
        } else {
            ctx.result = UnaryAddingOperator.MINUS;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitInteger_range(@NotNull AadlBaParser.Integer_rangeContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createIntegerRange();
        Iterator<Integer_valueContext> it = ctx.integer_value().iterator();
        IntegerValue tmp = it.next().result;
        ctx.result.setLowerIntegerValue(tmp);
        ctx.result.setUpperIntegerValue(it.next().result);
        ctx.result.setLocationReference(tmp.getLocationReference());
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitUnique_component_classifier_reference(
            @NotNull AadlBaParser.Unique_component_classifier_referenceContext ctx) {
        ctx.result = _decl.createQualifiedNamedElement();
        // Location reference is set in visitQualifiable_named_element.
        ctx.qualifiable_named_element().result = ctx.result;
        visitChildren(ctx);
        visitQualifiable_named_element(ctx.qualifiable_named_element());
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_condition(@NotNull AadlBaParser.Behavior_conditionContext ctx) {
        visitChildren(ctx);

        if (ctx.ON() != null) {
            if (ctx.dispatch_condition() != null && ctx.dispatch_condition().result != null) {
                setLocationReference(ctx.dispatch_condition().result, ctx.ON());
                ctx.result = ctx.dispatch_condition().result;
            }
        } else {
            if (ctx.execute_condition() != null && ctx.execute_condition().result != null) {
                ctx.result = ctx.execute_condition().result;
            } else {
                ctx.result = null;
            }
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_variable(@NotNull AadlBaParser.Behavior_variableContext ctx) {
        ctx.result = _fact.createBehaviorVariable();
        visitChildren(ctx);
        setLocationReference(ctx.result, ctx.IDENT());
        ctx.result.setName(ctx.IDENT().getText());

        DeclarativeArrayDimension dad = null;

        for (Integer_value_constantContext ivcc : ctx.integer_value_constant()) {
            dad = _decl.createDeclarativeArrayDimension();
            dad.setLocationReference(ivcc.result.getLocationReference());
            dad.setDimension(ivcc.result);
            ctx.result.getArrayDimensions().add(dad);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitFactor(@NotNull AadlBaParser.FactorContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createFactor();
        Iterator<ValueContext> it = ctx.value().iterator();
        Value tmpValue = it.next().result;
        ctx.result.setFirstValue(tmpValue);
        ctx.result.setLocationReference(tmpValue.getLocationReference());

        if (ctx.binary_numeric_operator() != null) {
            ctx.result.setBinaryNumericOperator(ctx.binary_numeric_operator().result);
            ctx.result.setSecondValue(it.next().result);
        } else if (ctx.unary_numeric_operator() != null) {
            ctx.result.setUnaryNumericOperator(ctx.unary_numeric_operator().result);
        } else if (ctx.unary_boolean_operator() != null) {
            ctx.result.setUnaryBooleanOperator(ctx.unary_boolean_operator().result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitRelational_operator(@NotNull AadlBaParser.Relational_operatorContext ctx) {
        if (ctx.EQUAL() != null) {
            ctx.result = RelationalOperator.EQUAL;
        } else if (ctx.NOTEQUAL() != null) {
            ctx.result = RelationalOperator.NOT_EQUAL;
        } else if (ctx.LESSTHAN() != null) {
            ctx.result = RelationalOperator.LESS_THAN;
        } else if (ctx.LESSOREQUAL() != null) {
            ctx.result = RelationalOperator.LESS_OR_EQUAL_THAN;
        } else if (ctx.GREATERTHAN() != null) {
            ctx.result = RelationalOperator.GREATER_THAN;
        } else {
            ctx.result = RelationalOperator.GREATER_OR_EQUAL_THAN;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_annex(@NotNull AadlBaParser.Behavior_annexContext ctx) {
        _ba = _fact.createBehaviorAnnex();
        ctx.result = _ba;

        for (Behavior_variable_listContext balc : ctx.behavior_variable_list()) {
            balc.ba = _ba;
        }

        for (Behavior_state_listContext bslc : ctx.behavior_state_list()) {
            bslc.ba = _ba;
        }

        visitChildren(ctx);

        if (ctx.TRANSITIONS() != null) {
            for (Behavior_transitionContext btc : ctx.behavior_transition()) {
                ctx.result.getTransitions().add(btc.result);
            }
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitElement_values(@NotNull AadlBaParser.Element_valuesContext ctx) {
        visitChildren(ctx);

        if (ctx.integer_range() != null) {
            ctx.result = ctx.integer_range().result;
        } else {
            ctx.result = (ElementValues) ctx.reference().result;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitReference(@NotNull AadlBaParser.ReferenceContext ctx) {
        visitChildren(ctx);

        ctx.result = _decl.createReference();

        ctx.result.setLocationReference(ctx.array_identifier(0).result.getLocationReference());

        for (Array_identifierContext aic : ctx.array_identifier()) {
            ctx.result.getIds().add(aic.result);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitValue_expression(@NotNull AadlBaParser.Value_expressionContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createValueExpression();

        Iterator<RelationContext> reIt = ctx.relation().iterator();
        Relation tmpRe = reIt.next().result;
        ctx.result.getRelations().add(tmpRe);
        ctx.result.setLocationReference(tmpRe.getLocationReference());

        if (!ctx.logical_operator().isEmpty()) {
            for (Logical_operatorContext loc : ctx.logical_operator()) {
                tmpRe = reIt.next().result;
                ctx.result.getRelations().add(tmpRe);
                ctx.result.getLogicalOperators().add(loc.result);
            }
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitNumeric_literal(@NotNull AadlBaParser.Numeric_literalContext ctx) {
        visitChildren(ctx);

        if (ctx.integer_literal() != null) {
            ctx.result = ctx.integer_literal().result;
        } else {
            ctx.result = ctx.real_literal().result;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitInteger_value(@NotNull AadlBaParser.Integer_valueContext ctx) {
        visitChildren(ctx);

        Value result = null;

        if (ctx.integer_value_constant() != null) {
            result = ctx.integer_value_constant().result;
        } else {
            result = ctx.value_variable().result;
        }

        ctx.result = (IntegerValue) result;

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitWhile_condition(@NotNull AadlBaParser.While_conditionContext ctx) {
        visitChildren(ctx);

        ctx.result = _fact.createWhileOrDoUntilStatement();
        setLocationReference(ctx.result, ctx.WHILE());
        ctx.result.setDoUntil(false);
        ctx.result.setLogicalValueExpression(ctx.value_expression().result);
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitInteger_value_constant(@NotNull AadlBaParser.Integer_value_constantContext ctx) {
        visitChildren(ctx);

        if (ctx.integer_literal() != null) {
            ctx.result = ctx.integer_literal().result;
        } else {
            ctx.result = ctx.property_reference().result;
        }

        return null;
    }

    /**
     * {@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 = _fact.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;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitForall_statement(@NotNull AadlBaParser.Forall_statementContext ctx) {
        visitChildren(ctx);

        ctx.result = ctx.forall_condition().result;
        ctx.result.setBehaviorActions(ctx.behavior_actions().result);
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitTarget(@NotNull AadlBaParser.TargetContext ctx) {
        visitChildren(ctx);

        ctx.result = ctx.reference().result;
        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitExecute_condition(@NotNull AadlBaParser.Execute_conditionContext ctx) {
        visitChildren(ctx);

        if (ctx.value_expression() != null) {
            ctx.result = ctx.value_expression().result;
        } else if (ctx.TIMEOUT() != null) {
            ctx.result = _fact.createExecutionTimeoutCatch();
            setLocationReference(ctx.result, ctx.TIMEOUT());
        } else {
            ctx.result = _fact.createOtherwise();
            setLocationReference(ctx.result, ctx.OTHERWISE());
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_actions(@NotNull AadlBaParser.Behavior_actionsContext ctx) {
        visitChildren(ctx);

        BehaviorActions firstAction = ctx.behavior_action(0).result;

        if (ctx.behavior_action().size() > 1) {
            BehaviorActionCollection tmp = null;

            if (ctx.SEMICOLON().size() > 0) {
                tmp = _fact.createBehaviorActionSequence();
            } else {
                tmp = _fact.createBehaviorActionSet();
            }

            tmp.setLocationReference(firstAction.getLocationReference());

            for (Behavior_actionContext bac : ctx.behavior_action()) {
                tmp.getActions().add(bac.result);
            }

            ctx.result = tmp;
        } else {
            ctx.result = firstAction;
        }

        return null;
    }

    /**
     * {@inheritDoc}
     * <p/>
     * The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.
     */
    @Override
    public T visitBehavior_transition(@NotNull AadlBaParser.Behavior_transitionContext ctx) {
        visitChildren(ctx);

        Identifier id = null;
        TerminalNode node = null;

        ctx.result = _decl.createDeclarativeBehaviorTransition();

        int srcStatesIndex = 0;

        if (ctx.transId != null) {
            ctx.result.setName(ctx.transId.getText());
            setLocationReference(ctx.result, ctx.transId);
            srcStatesIndex++;

            if (ctx.numeral() != null) {
                ctx.result.setPriority(ctx.numeral().result);
            }
        }

        if (ctx.result.getLocationReference() == null) {
            setLocationReference(ctx.result, ctx.IDENT(srcStatesIndex));
        }

        while (srcStatesIndex < ctx.IDENT().size() - 1) {
            node = ctx.IDENT(srcStatesIndex);
            id = _decl.createIdentifier();
            id.setId(node.getText());
            setLocationReference(id, node);
            ctx.result.getSrcStates().add(id);
            srcStatesIndex++;
        }

        // behavior condition can be null.
        if (ctx.behavior_condition() != null && ctx.behavior_condition().result != null) {
            _ba.getConditions().add(ctx.behavior_condition().result);
            ctx.result.setCondition(ctx.behavior_condition().result);
        }

        id = _decl.createIdentifier();
        id.setId(ctx.destId.getText());
        setLocationReference(id, ctx.destId);
        ctx.result.setDestState(id);

        if (ctx.behavior_action_block() != null) {
            _ba.getActions().add(ctx.behavior_action_block().result);
            ctx.result.setActionBlock(ctx.behavior_action_block().result);
        }

        return null;
    }

    @Override
    public T visitElsif_statement(Elsif_statementContext ctx) {
        visitChildren(ctx);
        IfStatement elsifStat = _fact.createIfStatement();
        ctx.result = elsifStat;
        elsifStat.setElif(true);
        setLocationReference(elsifStat, ctx.ELSIF());
        elsifStat.setLogicalValueExpression(ctx.value_expression().result);
        elsifStat.setBehaviorActions(ctx.behavior_actions().result);
        return null;
    }

    @Override
    public T visitReal_literal(Real_literalContext ctx) {
        String str = ctx.REAL_LIT().getText();
        BehaviorRealLiteral tmp = _fact.createBehaviorRealLiteral();
        str = str.replaceAll("_", "");
        tmp.setValue(str);
        setLocationReference(tmp, ctx.REAL_LIT());
        ctx.result = tmp;
        return null;
    }

    @Override
    public T visitIn_binding(In_bindingContext ctx) {
        visitChildren(ctx);
        ctx.ta.getProcessorClassifier().addAll(ctx.processor_parameter_list().result);
        return null;
    }

    @Override
    public T visitProperty_reference(Property_referenceContext ctx) {
        visitChildren(ctx);

        DeclarativePropertyReference result = _decl.createDeclarativePropertyReference();

        if (ctx.h1 != null) {
            result.setPropertySet(true);

            if (ctx.IDENT() != null) {
                Identifier nameSpaceId = _decl.createIdentifier();
                nameSpaceId.setId(ctx.IDENT().getText());
                setLocationReference(nameSpaceId, ctx.IDENT());

                Identifier dummy = _decl.createIdentifier();
                dummy.setId("");

                QualifiedNamedElement qne = _decl.createQualifiedNamedElement();
                qne.setBaNamespace(nameSpaceId);
                qne.setBaName(dummy); // Dummy. Do not use !
                qne.setLocationReference(nameSpaceId.getLocationReference());

                result.setQualifiedName(qne);
            }
        } else {
            if (ctx.reference() != null) {
                result.setReference(ctx.reference().result);
                result.setLocationReference(ctx.reference().result.getLocationReference());
            } else {
                result.setQualifiedName(ctx.qualified_named_element().result);
                result.setLocationReference(ctx.qualified_named_element().result.getLocationReference());
            }
        }

        for (Property_nameContext pnc : ctx.property_name()) {
            result.getPropertyNames().add(pnc.result);
        }

        ctx.result = result;

        return null;
    }

    @Override
    public T visitValue_constant(Value_constantContext ctx) {
        visitChildren(ctx);

        if (ctx.numeric_literal() != null) {
            ctx.result = ctx.numeric_literal().result;
        } else if (ctx.string_literal() != null) {
            ctx.result = ctx.string_literal().result;
        } else if (ctx.boolean_literal() != null) {
            ctx.result = ctx.boolean_literal().result;
        } else {
            ctx.result = ctx.property_reference().result;
        }

        return null;
    }

    @Override
    public T visitProperty_name(Property_nameContext ctx) {
        visitChildren(ctx);

        DeclarativePropertyName result = _decl.createDeclarativePropertyName();
        setLocationReference(result, ctx.IDENT());

        Identifier propertyName = _decl.createIdentifier();
        setLocationReference(propertyName, ctx.IDENT());
        propertyName.setId(ctx.IDENT().getText());
        result.setPropertyName(propertyName);

        if (ctx.UPPER_BOUND() != null) {
            UpperBound upField = _fact.createUpperBound();
            setLocationReference(upField, ctx.UPPER_BOUND());
            result.setField(upField);
        } else if (ctx.LOWER_BOUND() != null) {
            LowerBound lowerField = _fact.createLowerBound();
            setLocationReference(lowerField, ctx.LOWER_BOUND());
            result.setField(lowerField);
        } else if (false == ctx.integer_value().isEmpty()) {
            for (Integer_valueContext ivc : ctx.integer_value()) {
                result.getIndexes().add(ivc.result);
            }
        }

        ctx.result = result;

        return null;
    }
}