/*
* Copyright 2005-2008 Axel Kramer (axelclk@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.matheclipse.parser.server.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import org.matheclipse.parser.client.Parser;
import org.matheclipse.parser.client.ast.ASTNode;
import org.matheclipse.parser.client.ast.FunctionNode;
import org.matheclipse.parser.client.eval.ComplexEvaluator;
import org.matheclipse.parser.client.eval.DoubleEvaluator;
import org.matheclipse.parser.client.math.Complex;
import org.matheclipse.parser.client.math.MathException;
/**
* A java console program to run the evaluator interactivly
*/
public class Console {
private File fFile;
private boolean fComplexEvaluatorMode = false;
// private Parser fParser;
public static void main(final String args[]) {
printUsage();
Console console = new Console();
String expr = null;
console.setArgs(args);
final File file = console.getFile();
if (file != null) {
try {
final BufferedReader f = new BufferedReader(new FileReader(file));
final StringBuffer buff = new StringBuffer(1024);
String line;
while ((line = f.readLine()) != null) {
buff.append(line);
buff.append('\n');
}
f.close();
System.out.println(console.interpreter(buff.toString()));
} catch (final IOException ioe) {
final String msg = "Cannot read from the specified file. " + "Make sure the path exists and you have read permission.";
System.out.println(msg);
return;
}
}
while (true) {
try {
expr = console.readString(System.out, ">>> ");
if (expr != null) {
if ((expr.length() >= 4) && expr.toLowerCase().substring(0, 4).equals("exit")) {
break;
}
if ((expr.length() >= 6) && expr.toLowerCase().substring(0, 6).equals("double")) {
console.fComplexEvaluatorMode = false;
System.out.println("Double evaluation mode (switch to other mode with keyword 'complex')");
continue;
}
if ((expr.length() >= 7) && expr.toLowerCase().substring(0, 7).equals("complex")) {
console.fComplexEvaluatorMode = true;
System.out.println("Complex evaluation mode (switch to other mode with keyword 'double')");
continue;
}
System.out.println(console.interpreter(expr));
}
} catch (final Exception e) {
System.out.println(e.getMessage());
}
}
}
/**
* Prints the usage of how to use this class to System.out
*/
private static void printUsage() {
final String lineSeparator = System.getProperty("line.separator");
final StringBuffer msg = new StringBuffer();
msg.append(Console.class.getCanonicalName() + " [options]" + lineSeparator);
msg.append(lineSeparator);
msg.append("Options: " + lineSeparator);
msg.append(" -d or -double use Double evaluation mode" + lineSeparator);
msg.append(" -c or -complex use Complex evaluation mode" + lineSeparator);
msg.append(" -h or -help print this message" + lineSeparator);
msg.append(" -f or -file use given file as input" + lineSeparator);
msg.append("To stop the program type: " + lineSeparator);
msg.append("exit" + lineSeparator);
msg.append("To switch between the evaluation modes type: " + lineSeparator);
msg.append("complex or" + lineSeparator);
msg.append("double" + lineSeparator);
msg.append("To continue an input line type '\\' at the end of the line." + lineSeparator);
msg.append("****+****+****+****+****+****+****+****+****+****+****+****+");
System.out.println(msg.toString());
}
public Console() {
super();
}
/**
* Sets the arguments for the main method
*
* @param args
* the aruments of the program
*/
private void setArgs(final String args[]) {
for (int i = 0; i < args.length; i++) {
final String arg = args[i];
if (arg.equals("-double") || arg.equals("-d")) {
fComplexEvaluatorMode = false;
return;
} else if (arg.equals("-complex") || arg.equals("-c")) {
fComplexEvaluatorMode = true;
return;
} else if (arg.equals("-help") || arg.equals("-h")) {
printUsage();
return;
} else if (arg.equals("-file") || arg.equals("-f")) {
try {
fFile = new File(args[i + 1]);
i++;
} catch (final ArrayIndexOutOfBoundsException aioobe) {
final String msg = "You must specify a file when " + "using the -file argument";
System.out.println(msg);
return;
}
} else if (arg.charAt(0) == '-') {
// we don't have any more args to recognize!
final String msg = "Unknown arg: " + arg;
System.out.println(msg);
printUsage();
return;
}
}
}
/**
* Evaluates the given string-expression and returns the result in
* OutputForm
*
* @param strEval
*
*/
public String interpreter(final String strEval) {
try {
if (fComplexEvaluatorMode) {
Parser p = new Parser();
ASTNode obj = p.parse(strEval);
ComplexEvaluator engine = new ComplexEvaluator();
if (obj instanceof FunctionNode) {
obj = engine.optimizeFunction((FunctionNode) obj);
}
Complex c = engine.evaluateNode(obj);
return ComplexEvaluator.toString(c);
} else {
DoubleEvaluator engine = new DoubleEvaluator();
double d = engine.evaluate(strEval);
return Double.toString(d);
}
} catch (MathException e) {
System.err.println();
System.err.println(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
/**
* prints a prompt on the console but doesn't print a newline
*
* @param out
* @param prompt
* the prompt string to display
*
*/
public void printPrompt(final PrintStream out, final String prompt) {
out.print(prompt);
out.flush();
}
/**
* read a string from the console. The string is terminated by a newline
*
* @param out
* Description of Parameter
* @return the input string (without the newline)
*/
public String readString(final PrintStream out) {
final StringBuffer input = new StringBuffer();
final BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
boolean done = false;
try {
while (!done) {
final String s = in.readLine();
if (s != null) {
if ((s.length() > 0) && (s.charAt(s.length() - 1) != '\\')) {
input.append(s);
done = true;
} else {
if (s.length() > 1) {
input.append(s.substring(0, s.length() - 1));
} else {
input.append(' ');
}
}
}
}
} catch (final IOException e1) {
e1.printStackTrace();
}
return input.toString();
}
/**
* read a string from the console. The string is terminated by a newline
*
* @param prompt
* the prompt string to display
* @param out
* Description of Parameter
* @return the input string (without the newline)
*/
public String readString(final PrintStream out, final String prompt) {
printPrompt(out, prompt);
return readString(out);
}
/**
* @param file
*/
public void setFile(final File file) {
fFile = file;
}
/**
* @return the file with which the program was started or null
*/
public File getFile() {
return fFile;
}
}
Ads help maintain this website.