// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.plugins.commandline.parsers;
import graphtea.plugins.commandline.Shell;
import java.util.HashMap;
import java.util.HashSet;
/**
* @author Mohammad Ali Rostami
* @email rostamiev@gmail.com
*/
public class DefaultParser implements ExtParser {
HashMap<String, String> methods = new HashMap<>();
boolean is_initialized = false;
Shell shell;
public DefaultParser(Shell shell) {
this.shell = shell;
}
public String getName() {
return "default parser";
}
String clearStringOfNewline(String s) {
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '\n') {
String t = s.substring(0, s.indexOf('\n'));
if (s.indexOf('\n') != -1
&& s.indexOf('\n') + 1 <= s.length())
s = t + s.substring(s.indexOf('\n') + 1);
else
s = t;
}
}
return s;
}
public int count(String s, char c) {
int count = 0;
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) == c) count++;
return count;
}
public String correct(String s) {
if (!s.contains("(")) return s;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
int fp, ep;
if (s.substring(0, i).contains(",")) {
fp = s.substring(0, i).lastIndexOf(",") + 1;
if (s.substring(fp, i).contains("["))
fp = fp + s.substring(fp, i).lastIndexOf("[") + 1;
} else if (s.substring(0, i).contains("[")) fp = s.lastIndexOf("[") + 1;
else fp = 0;
ep = eatExtra(s, i, '(', ')');
Object o = eval(s.substring(fp, ep + 1));
String t1;
if (o instanceof String)
t1 = s.substring(0, fp) + "\"" + o + "\"";
else t1 = s.substring(0, fp) + o;
String t2 = "";
if (ep != s.length()) t2 = s.substring(ep + 1);
s = t1 + t2;
i = t1.length();
}
}
return s;
}
Object eval(String s) {
shell.evaluate("___ = " + s.trim() + ";");
return shell.get("___");
}
public Object[] parseSet(String sets) {
sets = sets.trim();
HashSet set = new HashSet();
boolean aa = false;
if (!sets.contains(",") && !sets.contains("[")) {
shell.evaluate("___ = " + sets.trim());
set.add(shell.get("___"));
return set.toArray();
}
for (int i = 0; i < sets.length(); i++) {
if (sets.charAt(i) == '[') {
String t = sets.substring(i);
int j = eatExtraBracket(t, 0);
set.add(parseSet(sets.substring(i + 1
, i + j)));
if (!sets.substring(i + 1).contains(","))
aa = true;
i = i + j;
aa = true;
}
if (sets.charAt(i) == ',') {
if (sets.substring(0, i).contains(",")) {
String s = "___ = "
+ sets.substring
(
sets.substring(0, i).lastIndexOf(',') + 1
, i).trim();
shell.evaluate(s);
} else {
String s1 = "___ = "
+ sets.substring(0
, i).trim();
shell.evaluate(s1);
}
set.add(shell.get("___"));
}
}
if (!aa) {
String iii = sets.substring(sets.lastIndexOf(",") + 1);
shell.evaluate("___ = " + iii.trim());
set.add(shell.get("___"));
}
return set.toArray();
}
public void initialize() {
shell.set_variable("temp_this", this);
shell.evaluate("Object[] parseSet(String s) {" +
"s = temp_this.correct(s);" +
"return temp_this.parseSet(s);" +
"}");
//methods.put("graph", "graph(String s){print(s);}");
}
public void add(String name, String method) {
shell.evaluate(method);
}
public int eatExtraBracket(String s, int start) {
return eatExtra(s, start, '[', ']');
}
public int eatExtra(String s, int start, char c1, char c2) {
int lb = 1, rb = 0;
for (int i = start + 1; i < s.length(); i++) {
if (s.charAt(i) == c1) lb++;
if (s.charAt(i) == c2) rb++;
if (lb == rb) return i;
}
return -1;
}
public String parse(String statement) {
if (statement.startsWith("[")) return ";";
statement = clearStringOfNewline(statement);
if (!is_initialized) initialize();
if (statement.contains("[")) {
int bracketIndex = statement.indexOf("[");
String p = statement.substring(0, bracketIndex);
p = p.trim();
if (p.length() != 0) {
if (p.charAt(p.length() - 1) == '='
|| p.charAt(p.length() - 1) == '(' || p.charAt(p.length() - 1) == ',') {
int rbracet = eatExtraBracket(statement, bracketIndex);
statement =
statement.substring(0, bracketIndex)
+
"parseSet(\""
+
statement.substring(bracketIndex + 1
, rbracet)
+ "\")" + statement.substring(rbracet + 1);
}
}
}
// System.out.println("modifying statement: " + statement);
return statement;
}
}