public override bool SemanticAnalysis() { IsSemanticCorrect = true; if (BeginningActivity != null) { foreach (var Act in BeginningActivity) { try { IsSemanticCorrect &= Act.SemanticAnalysis(); } catch (SemanticException e) { Console.WriteLine(e.Message); IsSemanticCorrect = false; } } } if (IsPredCondition) { if (ContinueCondition != null) { try { IsSemanticCorrect &= ContinueCondition.SemanticAnalysis(); } catch (SemanticException e) { Console.WriteLine(e.Message); IsSemanticCorrect = false; } } } if (IterationActivity != null) { try { IsSemanticCorrect &= IterationActivity.SemanticAnalysis(); } catch (SemanticException e) { Console.WriteLine(e.Message); IsSemanticCorrect = false; } } foreach (var oper in ChildrenOperators) { try { IsSemanticCorrect &= oper.SemanticAnalysis(); } catch (SemanticException e) { Console.WriteLine(e.Message); IsSemanticCorrect = false; } } if (ContinueCondition != null) //ещё раз проверить условие, так как оно проверятся на каждой итерации { try { IsSemanticCorrect &= ContinueCondition.SemanticAnalysis(); } catch (SemanticException e) { Console.WriteLine(e.Message); IsSemanticCorrect = false; } } CheckVariables(); return(IsSemanticCorrect); }
public override void GenerateIntermediateCode() { int num_cycle = ++Counters.cycles; if (BeginningActivity != null) { foreach (var oper in BeginningActivity) { oper.GenerateIntermediateCode(); } } //ставим метку - сюда будем возвращаться после каждой итерации IntermediateCodeList.push(new PutLabel("again_cycle_" + num_cycle.ToString())); if (IsPredCondition) { ContinueCondition.GenerateIntermediateCode(); //то, что получилось, сравниваем с нулём if (ContinueCondition.MainVariable.Type == "int") { IntermediateCodeList.push(new CmpNode(ContinueCondition.MainVariable, new ConstantNode("int", "0", 0).MainVariable)); } else if (ContinueCondition.MainVariable.Type == "bool") { IntermediateCodeList.push(new CmpNode(ContinueCondition.MainVariable, new ConstantNode("bool", "false", 0).MainVariable)); } else { Console.WriteLine("Что-то с типами в цикле"); } //если ложь, то на выход IntermediateCodeList.push(new GoToLabel("exit_cycle_" + num_cycle.ToString(), "je")); } //генерим код для тела цикла foreach (var oper in ChildrenOperators) { oper.GenerateIntermediateCode(); } //если есть последующее действие - генерим код для него if (IterationActivity != null) { IterationActivity.GenerateIntermediateCode(); } //если цикл с постусловием, то генерить здесть if (!IsPredCondition) { ContinueCondition.GenerateIntermediateCode(); //то, что получилось, сравниваем с нулём if (ContinueCondition.MainVariable.Type == "int") { IntermediateCodeList.push(new CmpNode(ContinueCondition.MainVariable, new ConstantNode("int", "0", 0).MainVariable)); } else if (ContinueCondition.MainVariable.Type == "bool") { IntermediateCodeList.push(new CmpNode(ContinueCondition.MainVariable, new ConstantNode("bool", "false", 0).MainVariable)); } else { Console.WriteLine("Что-то с типами в цикле"); } //если ложь, то на выход IntermediateCodeList.push(new GoToLabel("exit_cycle_" + num_cycle.ToString(), "je")); } //переход на следующую итерацию IntermediateCodeList.push(new GoToLabel("again_cycle_" + num_cycle.ToString(), "jmp")); //последняя метка - на выход IntermediateCodeList.push(new PutLabel("exit_cycle_" + num_cycle.ToString())); }