Beispiel #1
0
        public override bool VisitIfExpression(IfExpressionAST ast)
        {
            IfExpressionAST ifExpr = _other as IfExpressionAST;

            if (ifExpr == null)
            {
                return(false);
            }
            return(IsEqualNodes(ifExpr.ExpConditional, ast.ExpConditional) &&
                   IsEqualNodes(ifExpr.ExpressionThen, ast.ExpressionThen) &&
                   IsEqualNodes(ifExpr.ExpressionElse, ast.ExpressionElse));
        }
Beispiel #2
0
        public override Unit VisitIfExpression(IfExpressionAST ast)
        {
            //---> quedandome con el valor .
            bool pushOnStack = code.PushOnStack;

            ILGenerator il = code.Method.GetILGenerator();

            //generar el codigo de la condicional
            code.PushOnStack = true;
            ast.ExpConditional.Accept(this);

            //definiendo donde esta la marca del else
            Label parteElse = il.DefineLabel();
            //definiendo el final del if
            Label endIf = il.DefineLabel();

            //si la comparacion fue false salta a la parteElse
            il.Emit(OpCodes.Brfalse, parteElse);

            //sino ejecuta la parte del then
            code.PushOnStack = true;
            ast.ExpressionThen.Accept(this);
            //saltar al final del if
            il.Emit(OpCodes.Br, endIf);
            //marca la donde empieza el else
            il.MarkLabel(parteElse);
            //generar el else si lo tengo
            if (ast.ExpressionElse != null)
            {
                code.PushOnStack = true;
                ast.ExpressionElse.Accept(this);
            }
            //marcando el final de if
            il.MarkLabel(endIf);

            //quitar lo que hay en la pila "si hay algo" y no debo ponerlo
            if (!(ast.ReturnType is NoType) && !pushOnStack)
            {
                il.Emit(OpCodes.Pop);
            }
            //<--- poniendo el valor
            code.PushOnStack = pushOnStack;

            return(Unit.Create());
        }
Beispiel #3
0
        public override bool VisitIfExpression(IfExpressionAST ifExpr)
        {
            ifExpr.ExpConditional.Accept(this);
            ifExpr.ReturnType = TigerType.GetType <ErrorType>();
            if (ifExpr.ExpConditional.ReturnType != TigerType.GetType <IntType>())
            {
                _errorListener.Add(new AnalysisError(AnalysisError.LoadMessage("IfCond"), ifExpr.Line, ifExpr.Columns));
            }
            else if (ifExpr.ExpressionThen.Accept(this))
            {
                if (ifExpr.ExpressionElse != null)
                {
                    ifExpr.ExpressionElse.Accept(this);
                    ifExpr.ReturnType = ifExpr.ExpressionElse.ReturnType.CanConvertTo(ifExpr.ExpressionThen.ReturnType)
                                     ?
                                        ifExpr.ExpressionThen.ReturnType
                                     :
                                        ifExpr.ExpressionThen.ReturnType.CanConvertTo(ifExpr.ExpressionElse.ReturnType)
                                             ?
                                        ifExpr.ExpressionElse.ReturnType
                                             : TigerType.GetType <ErrorType>();
                    if (!(ifExpr.ReturnType is ErrorType))
                    {
                        return(ifExpr.AlwaysReturn = true);
                    }

                    _errorListener.Add(
                        new AnalysisError(
                            string.Format(AnalysisError.LoadMessage("Match"), ifExpr.ExpressionThen.ReturnType,
                                          ifExpr.ExpressionElse.ReturnType), ifExpr.Line, ifExpr.Columns));
                }
                ifExpr.AlwaysReturn = false;
                ifExpr.ReturnType   = TigerType.GetType <NoType>();
                return(true);
            }
            return(false);
        }
Beispiel #4
0
 public abstract T VisitIfExpression(IfExpressionAST ast);