第二个代码, ExpressionParser.java
package expressions;
import java.util.*;
public class ExpressionParser {
Scanner scanner;
public ExpressionParser(String str) {
scanner = new Scanner(str);
}
public Expression parse() {
Expression result = parseTerm();
if (result == null)
return null;
Expression nextOperand;
while (scanner.hasNext("\\+") || scanner.hasNext("\\-"))
if (scanner.hasNext("\\+")) {
scanner.next("\\+");
nextOperand = parseTerm();
if (nextOperand == null)
return null;
result = new Sum(result, nextOperand);
}
else if (scanner.hasNext("\\-")) {
scanner.next("\\-");
nextOperand = parseTerm();
if (nextOperand == null)
return null;
result = new Difference(result, nextOperand);
}
return result;
}
public Expression parseTerm() {
Expression result = parseFactor();
if (result == null)
return null;
Expression nextOperand;
while (scanner.hasNext("\\*") || scanner.hasNext("\\/"))
if (scanner.hasNext("\\*")) {
scanner.next("\\*");
nextOperand = parseFactor();
if (nextOperand == null)
return null;
result = new Product(result, nextOperand);
}
else if (scanner.hasNext("\\/")) {
scanner.next("\\/");
nextOperand = parseFactor();
if (nextOperand == null)
return null;
result = new Quotient(result, nextOperand);
}
return result;
}
public Expression parseFactor() {
Expression result;
Expression nextOperand1;
Expression nextOperand2;
if (scanner.hasNextInt())
return new Constant(scanner.nextInt());
else if (scanner.hasNext("\\(") || scanner.hasNext("fact\\(") || scanner.hasNext("gcd\\(") || scanner.hasNext("maxthree\\(")) {
if(scanner.hasNext("fact\\(")){
scanner.next("fact\\(");
result = parse();
if(result==null)
return null;
result = new Factorial(result);
if(scanner.hasNext("\\)"))
scanner.next("\\)");
else
return null;
}
else if(scanner.hasNext("gcd\\(")){
scanner.next("gcd\\(");
result=parse();
if(result==null)
return null;
if(scanner.hasNext("\\,")){
scanner.next("\\,");
nextOperand1=parse();
if(nextOperand1==null)
return null;
result= new GCD(result,nextOperand1);
}
else
return null;
if(scanner.hasNext("\\)"))
scanner.next("\\)");
else
return null;
}
else if(scanner.hasNext("maxthree\\(")){
scanner.next("maxthree\\(");
result=parse();
if(result==null)
return null;
if(scanner.hasNext("\\,")){
scanner.next("\\,");
nextOperand1=parse();
if(nextOperand1==null)
return null;
}
else
return null;
if(scanner.hasNext("\\,")){
scanner.next("\\,");
nextOperand2=parse();
if(nextOperand2==null)
return null;
result=new MaxThree(result,nextOperand1,nextOperand2);
}
else
return null;
if(scanner.hasNext("\\)"))
scanner.next("\\)");
else
return null;
}
else {
scanner.next("\\(");
result = parse();
if (scanner.hasNext("\\)"))
scanner.next("\\)");
else
return null;
}
}
else
return null;
return result;
}
}
第三个代码 InfixCalculator.java
package expressions;
import java.util.*;
public class InfixCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Infix Calculator");
System.out.println("Use spaces as delimiters.");
System.out.print("> ");
String line = scanner.nextLine();
while (line.length() > 0) {
ExpressionParser parser = new ExpressionParser(line);
Expression result = parser.parse();
if (result != null)
System.out.println(result.eval());
else
System.out.println("Invalid expression.");
System.out.print("> ");
line = scanner.nextLine();
}
}
}