Exemplo n.º 1
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="Cosmos.expression_booleenne"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitExpression_booleenne([NotNull] Cosmos.Expression_booleenneContext context)
 {
     return(VisitChildren(context));
 }
        public override CosmosBoolean VisitExpression_booleenne(Cosmos.Expression_booleenneContext context)
        {
            var firstChild = context.GetChild(0);

            switch (firstChild)
            {
            case Cosmos.Expression_booleenneContext _:
                var left            = Visit(context.gauche).Boolean().Value;
                var right           = context.droite;
                var booleanOperator = context.operateur;

                bool resultb;
                switch (booleanOperator.Type)
                {
                case OPERATEUR_LOGIQUE_OU:
                    resultb = left || Visit(right).Boolean().Value;
                    break;

                case OPERATEUR_LOGIQUE_ET:
                case ET:
                    resultb = left && Visit(right).Boolean().Value;
                    break;

                case OPERATEUR_LOGIQUE_EST:
                    var rightValue = context.VRAI() != null;
                    resultb = left == rightValue;
                    break;

                case OPERATEUR_LOGIQUE_OU_EXCLUSIF:
                    resultb = left ^ Visit(right).Boolean().Value;
                    break;

                case OPERATEUR_COMPARAISON_EQUIVALENT:
                    resultb = left == Visit(right).Boolean().Value;
                    break;

                case OPERATEUR_COMPARAISON_DIFFERENT:
                    resultb = left != Visit(right).Boolean().Value;
                    break;

                default:
                    throw new MissingTokenHandlerException(booleanOperator);
                }

                return(resultb.AsCosmosBoolean());

            case Cosmos.Expression_comparableContext _:
                var leftNb  = expressionVisitor.Visit(context.gaucheNb);
                var rightNb = expressionVisitor.Visit(context.droiteNb);

                var result = context.operateurNb.Type switch
                {
                    OPERATEUR_COMPARAISON_EQUIVALENT => leftNb == rightNb,
                    OPERATEUR_COMPARAISON_DIFFERENT => leftNb != rightNb,
                    OPERATEUR_COMPARAISON_PLUS_GRAND => leftNb > rightNb,
                    OPERATEUR_COMPARAISON_PLUS_PETIT => leftNb < rightNb,
                    OPERATEUR_COMPARAISON_PLUS_GRAND_OU_EGAL => leftNb >= rightNb,
                    OPERATEUR_COMPARAISON_PLUS_PETIT_OU_EGAL => leftNb <= rightNb,

                    _ => throw new MissingTokenHandlerException(context.operateurNb)
                };

                return(result.AsCosmosBoolean());

            case Cosmos.VariableContext variableContext:
                return(expressionVisitor.VariableVisitor.Visit(variableContext).Value.Boolean());


            default:
                if (context.OPERATEUR_LOGIQUE_NON() != null)
                {
                    return(!Visit(context.sousExpression));
                }
                else if (context.VRAI() != null)
                {
                    return(true.AsCosmosBoolean());
                }
                else if (context.FAUX() != null)
                {
                    return(false.AsCosmosBoolean());
                }
                else if (context.PARENTHESE_GAUCHE() != null)
                {
                    return(Visit(context.sousExpression));
                }

                break;
            }

            throw new MissingTokenHandlerException(context);
        }
Exemplo n.º 3
0
 public override CosmosTypedValue VisitExpression_booleenne(Cosmos.Expression_booleenneContext context)
 {
     return(booleanExpressionVisitor.Visit(context));
 }
Exemplo n.º 4
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="Cosmos.expression_booleenne"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitExpression_booleenne([NotNull] Cosmos.Expression_booleenneContext context)
 {
 }