private void ProcessEndIf(Lexem lastStack) { int iterator = labels.Pop(); int position = LabelFinder.PositionOpenLabel(poliz, "m" + (iterator + 1).ToString()); if (position == -1) // without "else" { this.poliz.Add(new Lexem(lastStack.LineNumber, "m" + (iterator).ToString(), PolizOperarionsList.kLexemKeyLabelEnd)); } else // with "else" { this.poliz.Add(new Lexem(lastStack.LineNumber, "m" + (iterator + 1).ToString(), PolizOperarionsList.kLexemKeyLabelEnd)); } }
public void Compile() { LastInputValue = int.MaxValue; int commandIterator = 0; this.poliz = PolizAnalyzer.sharedAnalyzer.Poliz; for (int i = 0; i < this.poliz.Count; i++) { PolizAnalyzer.sharedAnalyzer.LogLexems("Poliz", this.poliz); if (poliz[i].Command == "=") { Out.Log(Out.State.LogDebug, "Will change value for ID " + poliz[commandIterator].Command + " (old value " + poliz[commandIterator].Value + ")"); poliz[commandIterator].Value = CalculateExpression(new List <Lexem>(this.poliz), commandIterator + 1, i - 1); Out.Log(Out.State.LogDebug, "Did change value for ID " + poliz[commandIterator].Command + " (new value " + poliz[commandIterator].Value + ")"); commandIterator = i + 1; } else if (poliz[i].Command == "output") { for (int j = commandIterator; j < i; j++) { if (poliz[j].Command[0] == '"') { Out.Log(Out.State.ApplicationOutput, poliz[j].Command. Replace("\"", "").Replace("_", " ").Replace(" ", " ").Remove(0, 1)); } else if (poliz[j].isCONST()) { Out.Log(Out.State.ApplicationOutput, poliz[j].Command); } else { Out.Log(Out.State.ApplicationOutput, poliz[j].Command + " = " + poliz[j].Value); } } commandIterator = i + 1; } else if (poliz[i].Command == "input") { for (int j = commandIterator; j < i; j++) { Gtk.Application.Invoke(delegate { InputIDDialog dialog = new InputIDDialog(); dialog.Title = "Введите значение " + poliz[j].Command; dialog.Response += DidConfirmInputDialog; dialog.Run(); dialog.Destroy(); }); // Synchronize threads. Better use Mutex or Semaphore // while (LastInputValue == int.MaxValue) { Thread.Sleep(100); } poliz[j].Value = LastInputValue; LastInputValue = int.MaxValue; } commandIterator = i + 1; } else if (poliz[i].Key == PolizOperarionsList.kLexemKeyUPL) // if { bool ok = CalculateLogicalExpression(commandIterator, i - 2); if (false == ok) // false. go to "else" block { string destinationLabel = poliz[i - 1].Command; i = LabelFinder.PositionCloseLabel(poliz, destinationLabel); } commandIterator = i + 1; } else if (poliz[commandIterator].Key == PolizOperarionsList.kLexemKeyLabelStart && poliz[commandIterator + 1].Key == PolizOperarionsList.kLexemKeyBP) // unused "else" block { string destinationLabel = poliz[commandIterator].Command; i = LabelFinder.PositionCloseLabel(poliz, destinationLabel); commandIterator = i + 1; } else if (poliz[i].Key == PolizOperarionsList.kLexemKeyLabelEnd) // endif { i++; commandIterator = i; } } PolizAnalyzer.sharedAnalyzer.LogLexems("Poliz", this.poliz); Out.Log(Out.State.ApplicationOutput, "\n" + "============================\n" + "Приложение отработало корректно\n" + "Результаты вычислений приблизительные, поскольку программа " + "работает только с целыми числами"); }