以下是我正在上课的项目。此赋值的目的是采用后缀表达式并将其转换为汇编语言指令。第一次运行后,我无法让循环打印出正确的指令。有人可以向我解释我做错了什么,因为我已经调试了一段时间而且我被卡住了?此外,由于我是java的新手,任何关于如何使我的程序更有效的评论或任何你想要指出的解释,我将不胜感激。我相信有更多的方法可以做到这一点,但请记住我是新的,我还没有学到的东西。
.txt输入文件上有什么:
AB + C- //循环1
ABC + - //循环2
AB-C + DEF - + $ //循环3
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class PostfixConverter{
static int top = 0;
static String [] mainStack = new String [100];
public static void main(String args[]) throws Exception{
String string = null;
String asterisk = "*";
String divisor = "/";
String plus = "+";
String minus = "-";
int temp =0;
int directionCounter = 0;
String load = "LD ";
String multiply = "ML ";
String add = "AD ";
String div = "DV ";
String subtract = "SB ";
String store = "ST TEMP";
String tempString = "TEMP";
String [] directions = new String [100];
String example = "AB+C-";
PostfixConverter s = new PostfixConverter();
try{
//file reader code
FileReader file = new FileReader ("/Users/ChristopherSchubert/Desktop/PostfixMachineLangInput(1).txt");
BufferedReader reader = new BufferedReader(file);
String text = "";
String line = reader.readLine();
while (line!= null)
{
text += line;
line = reader.readLine();
example = text;
//for loop to print directions
for (int i=0; i<example.length(); i++) {
//get letter entered by user 1 by 1
char letter = example.charAt(i);
//convert char to string
String convertedChar = java.lang.String.valueOf(letter);
//finds operands in order or priority
//multiply character
if (convertedChar.equals(asterisk)){
String outcome;
String multiplyReturn = PostfixConverter.multiply(string);
String loadmulReturn = PostfixConverter.multiply(string);
directions[directionCounter] = load + loadmulReturn;
directionCounter++;
directions[directionCounter] = multiply + multiplyReturn;
directionCounter++;
temp++;
outcome = tempString + java.lang.String.valueOf(temp);
directions[directionCounter] = store + java.lang.String.valueOf(temp);
directionCounter++;
s.push(outcome);
}
//division character
else if (convertedChar.equals(divisor)){
String outcome;
String divisionReturn = PostfixConverter.addition(string);
String loaddivReturn = PostfixConverter.addition(string);
directions[directionCounter] = load + loaddivReturn;
directionCounter++;
directions[directionCounter] = div + divisionReturn;
directionCounter++;
temp++;
outcome = tempString + java.lang.String.valueOf(temp);
directions[directionCounter] = store + java.lang.String.valueOf(temp);
directionCounter++;
s.push(outcome);
}
//addition character
else if (convertedChar.equals(plus)){
String outcome;
String additionReturn = PostfixConverter.addition(string);
String loadAddReturn = PostfixConverter.addition(string);
directions[directionCounter] = load + loadAddReturn;
directionCounter++;
directions[directionCounter] = add + additionReturn;
directionCounter++;
temp++;
outcome = tempString + java.lang.String.valueOf(temp);
directions[directionCounter] = store + java.lang.String.valueOf(temp);
directionCounter++;
s.push(outcome);
}
//subtraction character
else if (convertedChar.equals(minus)){
String outcome;
String subtractionReturn = PostfixConverter.addition(string);
String loadsubReturn = PostfixConverter.addition(string);
directions[directionCounter] = load + loadsubReturn;
directionCounter++;
directions[directionCounter] = subtract + subtractionReturn;
directionCounter++;
temp++;
outcome = tempString + java.lang.String.valueOf(temp);
directions[directionCounter] = store + java.lang.String.valueOf(temp);
directionCounter++;
s.push(outcome);
}
//letter character
else {
s.push(convertedChar);
}
}
//print out the instructions
System.out.println("Assembly Directions are as follows: ");
int printDirections = 0;
for (int i=0; i< directionCounter; i++){
System.out.println(directions[printDirections]);
printDirections++;
}
printDirections=0;
directionCounter=0;
System.out.println("This is the end of the directions.");
System.out.println("");
directionCounter = 0;
temp = 0;
top = 0;
}
}
catch (FileNotFoundException exception)
{
System.out.println("The file was not found.");
}
}
//multiply method
public static String multiply(String a){
String multVariable = PostfixConverter.pop(mainStack[top]);
top--;
return multVariable;
}
//addition method
public static String addition(String a){
String addVariable = PostfixConverter.pop(mainStack[top]);
top--;
return addVariable;
}
//subtraction method
public static String subtraction(String a){
String subVariable = PostfixConverter.pop(mainStack[top]);
top--;
return subVariable;
}
//division method
public static String division(String a){
String divVariable = PostfixConverter.pop(mainStack[top]);
top--;
return divVariable;
}
public static boolean empty(){
if (top == -1)
return true;
else
return false;
}
public static String pop(String j){
if (empty()){
System.out.println("Stack Underflow");
System.exit(1);
}
return mainStack[top - 1];
}
public void push (String x){
if (top == 99){
System.out.println("Stack Overflow");
System.exit(1);
}else
mainStack[top] = x;
top++;
}//end push
}
以下是正在打印的内容:
循环1:
装配方向如下:
LD A
AD B
ST TEMP1
LD TEMP1
SB C
ST TEMP2
这是方向的结束。 //看起来是正确的
循环2:
装配方向如下:
LD A //从上面复制
AD B
ST TEMP1
LD TEMP1
SB C
ST TEMP2
LD B //第二个循环实际开始的地方
AD C
ST TEMP3
LD A
SB TEMP3
ST TEMP4
这是指示的结束。
答案 0 :(得分:1)
我稍微改变了文件的读取方式,并包含了调整后的代码输出。如果这会产生预期结果,请告诉我:
String line = "";
while ((line = reader.readLine()) != null)
{
example = line;
// Continue to process ...
编辑:这是一个更模块化的方法,它演示了我在评论中引用的内容(注意'processOperand()'的介绍,以及它如何使代码更具可读性)。它只是寻找公共代码并使其在各种情况下“可用”的一个示例(即每个操作调用相同的代码块传递唯一参数)
public class PostfixConverter {
static int top = 0;
static String[] mainStack = new String[100];
final static String asterisk = "*";
final static String divisor = "/";
final static String plus = "+";
final static String minus = "-";
final static String store = "ST TEMP";
static int temp = 0;
static int directionCounter = 0;
static String[] directions = new String[100];
static PostfixConverter s = new PostfixConverter();
static String tempString = "TEMP";
public static void main(String args[]) throws Exception {
String string = null;
String load = "LD ";
String multiply = "ML ";
String add = "AD ";
String div = "DV ";
String subtract = "SB ";
String example = "AB+C-";
try {
// file reader code
FileReader file = new FileReader("....");
BufferedReader reader = new BufferedReader(file);
String line = "";
while ((line = reader.readLine()) != null) {
example = line;
// for loop to print directions
for (int i = 0; i < example.length(); i++) {
// get letter entered by user 1 by 1
char letter = example.charAt(i);
// convert char to string
String convertedChar = java.lang.String.valueOf(letter);
// finds operands in order or priority
// multiply character
if (convertedChar.equals(asterisk)) {
processOperand(PostfixConverter.multiply(string), PostfixConverter.multiply(string), load,
multiply);
}
// division character
else if (convertedChar.equals(divisor)) {
processOperand(PostfixConverter.addition(string), PostfixConverter.addition(string), load, div);
}
// addition character
else if (convertedChar.equals(plus)) {
processOperand(PostfixConverter.addition(string), PostfixConverter.addition(string), load, add);
}
// subtraction character
else if (convertedChar.equals(minus)) {
processOperand(PostfixConverter.addition(string), PostfixConverter.addition(string), load,
subtract);
}
// letter character
else {
s.push(convertedChar);
}
}
// print out the instructions
System.out.println("Assembly Directions are as follows: ");
int printDirections = 0;
for (int i = 0; i < directionCounter; i++) {
System.out.println(directions[printDirections]);
printDirections++;
}
printDirections = 0;
directionCounter = 0;
System.out.println("This is the end of the directions.");
System.out.println("");
directionCounter = 0;
temp = 0;
top = 0;
}
} catch (FileNotFoundException exception) {
System.out.println("The file was not found.");
}
}
private static void processOperand(String postFileConverterOutput, String postFileConverterOutput2,
String instruction1, String instruction2) {
String outcome;
String opReturn1 = postFileConverterOutput;
String opReturn2 = postFileConverterOutput2;
directions[directionCounter] = instruction1 + opReturn2;
directionCounter++;
directions[directionCounter] = instruction2 + opReturn1;
directionCounter++;
temp++;
outcome = tempString + java.lang.String.valueOf(temp);
directions[directionCounter] = store + java.lang.String.valueOf(temp);
directionCounter++;
s.push(outcome);
}
// multiply method
public static String multiply(String a) {
String multVariable = PostfixConverter.pop(mainStack[top]);
top--;
return multVariable;
}
// addition method
public static String addition(String a) {
String addVariable = PostfixConverter.pop(mainStack[top]);
top--;
return addVariable;
}
// subtraction method
public static String subtraction(String a) {
String subVariable = PostfixConverter.pop(mainStack[top]);
top--;
return subVariable;
}
// division method
public static String division(String a) {
String divVariable = PostfixConverter.pop(mainStack[top]);
top--;
return divVariable;
}
public static boolean empty() {
if (top == -1)
return true;
else
return false;
}
public static String pop(String j) {
if (empty()) {
System.out.println("Stack Underflow");
System.exit(1);
}
return mainStack[top - 1];
}
public void push(String x) {
if (top == 99) {
System.out.println("Stack Overflow");
System.exit(1);
} else
mainStack[top] = x;
top++;
}// end push
}
创建输出:
Assembly Directions are as follows:
LD A
AD B
ST TEMP1
LD TEMP1
SB C
ST TEMP2
This is the end of the directions.
Assembly Directions are as follows:
LD B
AD C
ST TEMP1
LD A
SB TEMP1
ST TEMP2
This is the end of the directions.
Assembly Directions are as follows:
LD A
SB B
ST TEMP1
LD TEMP1
AD C
ST TEMP2
LD E
SB F
ST TEMP3
LD D
AD TEMP3
ST TEMP4
This is the end of the directions.