void polizWhile(Node[] masTableLexAnalysis) { try { List listA = new List(); Stack listM = new Stack(); for (int i = g; g < masTableLexAnalysis.Length; g++) { string word = getWord(masTableLexAnalysis[g]); if (word == "do") { listA.add(Convert.ToString(countWordPoliz + 1)); polizLogTerm(masTableLexAnalysis, g + 2); m++; listM.push("M" + m); resultsPolizString += "M" + m + " !F "; countWordPoliz+=2; g++; whatOperatorForPoliz(masTableLexAnalysis); m++; listM.push("M" + m); resultsPolizString += "M" + m + " ! "; countWordPoliz += 2; listA.add(Convert.ToString(countWordPoliz + 1)); } else if (word == "loop") { g++; break; } } LabelList.add(listM.pop(), listA.pop()); LabelList.add(listM.pop(), listA.pop()); } catch { errorsTextBox.Text = "Возникла неизвестная ошибка при выполнении перевода в полиз"; } }
void TranslateToGenarationCode() { try { int coutntString = 1;//Количество строк в генерации int adr = 500; string[] poliz = resultsPolizString.Split(' ', '\n'); Stack stack = new Stack(); Node[] masLabel = LabelList.getData(); for (int i = 0; i < poliz.Length; i++) { string s = poliz[i]; if (s == "") continue; else if (isDigit(s)) { stack.push(s, 0); } else if (isId(s)) { stack.push(s, adr); adr++; } else if (isArifSign(s)) //арифметическая операция { NodeGen b = stack.popGen(); NodeGen a = stack.popGen(); if (isId(a.value)) { adr--; generationBox.AppendText(coutntString+") "+"RD " + a.adr + "\n"); coutntString++; } else if (isDigit(a.value)) { generationBox.AppendText(coutntString + ") " + "RD #" + a.value + "\n"); coutntString++; } if (isId(b.value)) { adr--; switch (s) { case ("-"): generationBox.AppendText(coutntString + ") " + "SUB " + b.adr + "\n"); break; case ("+"): generationBox.AppendText(coutntString + ") " + "ADD " + b.adr + "\n"); break; case ("*"): generationBox.AppendText(coutntString + ") " + "MUL " + b.adr + "\n"); break; case ("/"): generationBox.AppendText(coutntString + ") " + "DIV " + b.adr + "\n"); break; } coutntString++; } else if (isDigit(b.value)) { switch (s) { case ("-"): generationBox.AppendText(coutntString + ") " + "SUB #" + b.value + "\n"); break; case ("+"): generationBox.AppendText(coutntString + ") " + "ADD #" + b.value + "\n"); break; case ("*"): generationBox.AppendText(coutntString + ") " + "MUL #" + b.value + "\n"); break; case ("/"): generationBox.AppendText(coutntString + ") " + "DIV #" + b.value + "\n"); break; } coutntString++; } generationBox.AppendText(coutntString + ") " + "WR 700 \n"); coutntString++; } else if (s == ":=") { generationBox.AppendText(coutntString + ") " + "RD 700 \n"); coutntString++; generationBox.AppendText(coutntString + ") " + "WR " + stack.popGen().adr + "\n"); coutntString++; } else if (isLogSing(s))//смотрим знак { NodeGen b = stack.popGen(); NodeGen a = stack.popGen(); if (isId(a.value)) { adr--; generationBox.AppendText(coutntString + ") " + "RD " + a.adr + "\n"); coutntString++; } else if (isDigit(a.value)) { generationBox.AppendText(coutntString + ") " + "RD #" + a.value + "\n"); coutntString++; } if (isId(b.value)) { adr--; generationBox.AppendText(coutntString + ") " + "SUB " + b.adr + "\n"); coutntString++; switch (s) { case ">": generationBox.AppendText(coutntString + ") " + "JS " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case "<": generationBox.AppendText(coutntString + ") " + "JNS " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case "!=": generationBox.AppendText(coutntString + ") " + "JZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case "==": generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case ">=": generationBox.AppendText(coutntString + ") " + "JS " + getAdr(poliz[i + 1], masLabel) + "\n"); coutntString++; generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case "<=": generationBox.AppendText(coutntString + ") " + "JNS " + getAdr(poliz[i + 1], masLabel) + "\n"); coutntString++; generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; } coutntString++; } else if (isDigit(b.value)) { generationBox.AppendText(coutntString + ") " + "SUB #" + b.value + "\n"); switch (s) { case ">": generationBox.AppendText(coutntString + ") " + "JS " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case "<": generationBox.AppendText(coutntString + ") " + "JNS " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case "!=": generationBox.AppendText(coutntString + ") " + "JZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case "==": generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case ">=": generationBox.AppendText(coutntString + ") " + "JS " + getAdr(poliz[i + 1], masLabel) + "\n"); coutntString++; generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; case "<=": generationBox.AppendText(coutntString + ") " + "JNS " + getAdr(poliz[i + 1], masLabel) + "\n"); coutntString++; generationBox.AppendText(coutntString + ") " + "JNZ " + getAdr(poliz[i + 1], masLabel) + "\n"); i += 2; break; } coutntString++; } } else if (s == "!") { generationBox.AppendText(coutntString + ") " + "JMP " + getAdr(poliz[i - 1], masLabel) + "\n"); coutntString++; } else if (s == "READ") { generationBox.AppendText(coutntString + ") " + "WR " + stack.popGen().adr + "\n"); coutntString++; for (int j = 1; j < Convert.ToInt16(poliz[i + 1]); j++) { generationBox.AppendText(coutntString + ") " + "WR " + stack.popGen().adr + "\n"); coutntString++; } i++; } else if (s == "WRITE") { generationBox.AppendText(coutntString + ") " + "RD 700 \n"); coutntString++; } else if (s == "end") { generationBox.AppendText(coutntString + ") " + "HLT"); coutntString++; } } } catch { errorsTextBox.Text = "Возникла неизвестная ошибка при генерации кода."; } }
void polizFor(Node[] masTableLexAnalysis) { try { List listA = new List(); Stack listM = new Stack(); string id = getWord(masTableLexAnalysis[g + 1]); for (int i = g; g < masTableLexAnalysis.Length; g++) { string word = getWord(masTableLexAnalysis[g]); if (word == "for") { g++; polizAssigned(masTableLexAnalysis); } else if (word == "to") { listA.add(Convert.ToString(countWordPoliz + 1)); g++; polizArifTerm(masTableLexAnalysis); m++; listM.push("M" + m); resultsPolizString += "M" + m + " !F "; countWordPoliz += 2; } else if (word == "do") { g++; whatOperatorForPoliz(masTableLexAnalysis); m++; resultsPolizString += id + " " + id + " " + "1 + := " + "M" + m + " ! "; countWordPoliz += 7; listM.push("M" + m); } else if (word == ";") break; } listA.add(Convert.ToString(countWordPoliz)); LabelList.add(listM.pop(), listA.pop()); LabelList.add(listM.pop(), listA.pop()); } catch { errorsTextBox.Text = "Возникла неизвестная ошибка при выполнении перевода в полиз"; } }