Exemple #1
0
        public override void GenerateIntermediateCode()
        {
            //номер условного оператора, нужен для формирования меток
            int num_if = ++Counters.ifs;

            Condition.GenerateIntermediateCode();
            //то, что получилось, сравниваем с нулём
            if (Condition.MainVariable.Type == "int")
            {
                IntermediateCodeList.push(new CmpNode(Condition.MainVariable, new ConstantNode("int", "0", 0).MainVariable));
            }
            else if (Condition.MainVariable.Type == "bool")
            {
                IntermediateCodeList.push(new CmpNode(Condition.MainVariable, new ConstantNode("bool", "false", 0).MainVariable));
            }
            else
            {
                Console.WriteLine("Что-то не так с типами");
            }

            if (ElseBranch == null)
            {
                //если else-ветки нет, формируем метку на выход, если условие не выполнено
                //если равно нулю, то условие ложно и уходим
                IntermediateCodeList.push(new GoToLabel("exit_if_" + num_if.ToString(), "je"));
            }
            else
            {
                //если вторая ветка есть, формируем метку на неё
                IntermediateCodeList.push(new GoToLabel("else_" + num_if.ToString(), "je"));
            }
            //генерим код для if-ветки, она будет в любом случае
            IfBranch.GenerateIntermediateCode();
            //если есть вторая ветка, надо сгенерить код для неё
            if (ElseBranch != null)
            {
                //из if-ветки отправляем на выход
                IntermediateCodeList.push(new GoToLabel("exit_if_" + num_if.ToString(), "jmp"));
                //ставим метку else
                IntermediateCodeList.push(new PutLabel("else_" + num_if.ToString()));
                //Генерируем код else-ветки
                ElseBranch.GenerateIntermediateCode();
            }
            //ставим метку на выход
            IntermediateCodeList.push(new PutLabel("exit_if_" + num_if.ToString()));
        }