Пример #1
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="Cosmos.expression_numerique"/>.
 /// <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_numerique([NotNull] Cosmos.Expression_numeriqueContext context)
 {
     return(VisitChildren(context));
 }
Пример #2
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="Cosmos.expression_numerique"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitExpression_numerique([NotNull] Cosmos.Expression_numeriqueContext context)
 {
 }
Пример #3
0
 public override CosmosTypedValue VisitExpression_numerique(Cosmos.Expression_numeriqueContext context)
 {
     return(numericExpressionVisitor.Visit(context));
 }
Пример #4
0
        public override CosmosNumber VisitExpression_numerique(Cosmos.Expression_numeriqueContext context)
        {
            switch (context.GetChild(0))
            {
                //Si le premier élément est un numérique, on assume la forme gauche operateur droite....
                case Cosmos.Expression_numeriqueContext _:
                    var left = Visit(context.gauche);
                    var right = Visit(context.droite);

                    return context.operateur.Type switch
                    {
                        OPERATEUR_MATH_PUISSANCE => left ^ right,
                        OPERATEUR_MATH_FOIS => left * right,
                        OPERATEUR_MATH_DIVISE => left / right,
                        OPERATEUR_MATH_PLUS => left + right,
                        OPERATEUR_MATH_MOINS => left - right,
                        OPERATEUR_MATH_MODULO2 => left % right,

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


                case Cosmos.Atome_numeriqueContext atomeNumeriqueContext when atomeNumeriqueContext.pi() != null:
                {
                    return Math.PI.AsCosmosNumber();
                }
                case Cosmos.Atome_numeriqueContext atomeNumeriqueContext:
                    return Visit(atomeNumeriqueContext.nombre());

                case Cosmos.NombreContext nombreContext:
                    return VisitNombre(nombreContext);

                case Cosmos.VariableContext variableContext:
                    var variable = variableVisitor.Visit(variableContext);
                    if (variable.Value == null)
                    {
                        throw new EmptyVariableException(variable,variableContext);
                    }
                    else
                    {
                        return variable.Value.Number();
                    }

                //autre forme que gauche operateur droite
                default:
                    if (context.PARENTHESE_GAUCHE() != null)
                        return Visit(context.sousExpression);
                    else
                        return context.operateur.Type switch
                        {
                            OPERATEUR_MATH_MOINS => -Visit(context.sousExpression),
                            OPERATEUR_MATH_PLUS  => Visit(context.sousExpression),
                            OPERATEUR_MATH_RACINE_CARREE => Visit(context.gauche).Nroot(),
                            OPERATEUR_MATH_SINUS => Math.Sin(Convert.ToDouble(Visit(context.gauche).Value)).AsCosmosNumber(),
                            OPERATEUR_MATH_COSINUS => Math.Cos(Convert.ToDouble(Visit(context.gauche).Value)).AsCosmosNumber(),
                            OPERATEUR_MATH_MODULO1 => Visit(context.gauche)%Visit(context.droite),

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


        }