Example #1
0
 /// <summary>
 /// Visit a parse tree produced by the <c>expressionContentRelational</c>
 /// labeled alternative in <see cref="FaParser.expressionContent"/>.
 /// <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 VisitExpressionContentRelational([NotNull] FaParser.ExpressionContentRelationalContext context)
 {
     return(VisitChildren(context));
 }
Example #2
0
    public override object VisitExpressionContentRelational(FaParser.ExpressionContentRelationalContext context)
    {
        object left       = Visit(context.expressionContent(0));
        object right      = Visit(context.expressionContent(1));
        bool   leftIsNum  = left   is int || left  is double;
        bool   rigthIsNum = right is int || right is double;
        bool   areNums    = leftIsNum && rigthIsNum;
        bool   areStrgs   = left is string && right is string;

        object result = false;

        switch (context.RELATIONAL().GetText())
        {
        case "menorque":
            if (areNums)
            {
                result = Convert.ToDouble(left) < Convert.ToDouble(right);
            }
            else if (areStrgs)
            {
                result = String.Compare(left.ToString(), right.ToString()) < 0;
            }
            else
            {
                Debug.LogError("No es posible hacer esta operacion relacional entre estos tipos de datos: " + getType(left) + " contra " + getType(right));
                // Console.WriteLine("No es posible hacer esta operacion relacional entre estos tipos de datos: "+getType(left)+" contra "+getType(right));
                MyConsole.main.AppendText("No es posible hacer esta operacion relacional entre estos tipos de datos: " + getType(left) + " contra " + getType(right));
            }
            break;

        case "menorigual":
            if (areNums)
            {
                result = Convert.ToDouble(left) <= Convert.ToDouble(right);
            }
            else if (areStrgs)
            {
                result = String.Compare(left.ToString(), right.ToString()) <= 0;
            }
            else
            {
                Debug.LogError("No es posible hacer esta operacion relacional entre estos tipos de dato");
                // Console.WriteLine("No es posible hacer esta operacion relacional entre estos tipos de dato");
                MyConsole.main.AppendText("No es posible hacer esta operacion relacional entre estos tipos de dato");
            }
            break;

        case "mayorque":
            if (areNums)
            {
                result = (bool)(Convert.ToDouble(left) > Convert.ToDouble(right));
            }
            else if (areStrgs)
            {
                result = String.Compare(left.ToString(), right.ToString()) > 0;
            }
            else
            {
                Debug.LogError("No es posible hacer esta operacion relacional entre estos tipos de dato");
                // Console.WriteLine("No es posible hacer esta operacion relacional entre estos tipos de dato");
                MyConsole.main.AppendText("No es posible hacer esta operacion relacional entre estos tipos de dato");
            }
            break;

        case "mayorigual":
            if (areNums)
            {
                result = Convert.ToDouble(left) >= Convert.ToDouble(right);
            }
            else if (areStrgs)
            {
                result = String.Compare(left.ToString(), right.ToString()) >= 0;
            }
            else
            {
                Debug.LogError("No es posible hacer esta operacion relacional entre estos tipos de dato");
                // Console.WriteLine("No es posible hacer esta operacion relacional entre estos tipos de dato");
                MyConsole.main.AppendText("No es posible hacer esta operacion relacional entre estos tipos de dato");
            }
            break;
        }

        return(result);
    }