Exemplo n.º 1
0
        public override void GenCode(ICodeGenerator cg)
        {
            var gen      = cg.GetGenerator;
            var endLabel = gen.DefineLabel();

            ConditionExp.GenCode(cg);
            gen.Emit(OpCodes.Brfalse, endLabel);
            ThenInstruction.GenCode(cg);
            gen.MarkLabel(endLabel);
        }
Exemplo n.º 2
0
        protected override bool CheckInstructions(List <Error> errors, SymbolTable symbolTable)
        {
            //Note: aqui mismo actualizo el hasBreak, para no tener ke pasar otra vez por cada instruccion
            //Note: aqui mismo actualizo el ReturnType en caso de error para ke TypeChecking solo se encargue del checkeo correcto de tipos

            //Check ThenInstruccion
            bool thenOk = ThenInstruction.CheckSemantic(errors, symbolTable);

            hasBreak = (ThenInstruction is IBreakable && (ThenInstruction as IBreakable).HasBreak);
            if (thenOk)
            {
                return(true);
            }
            ReturnType = TypeExpression.ErrorType;
            return(false);
        }
Exemplo n.º 3
0
        public override void GenCode(ICodeGenerator cg)
        {
            var gen       = cg.GetGenerator;
            var endLabel  = gen.DefineLabel();
            var elseLabel = gen.DefineLabel();

            ConditionExp.GenCode(cg);
            gen.Emit(OpCodes.Brfalse, elseLabel);//Si la condicion es falsa salto al else

            ThenInstruction.GenCode(cg);
            gen.Emit(OpCodes.Br, endLabel);//si fue verdadera despues de generar el thenInstruction y salto a la endLabel para terminar

            gen.MarkLabel(elseLabel);
            ElseInstruction.GenCode(cg);//si salte al else genero el ElseInstruction y termino

            gen.MarkLabel(endLabel);
        }