001 // GraphLab Project: http://graphlab.sharif.edu 002 // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology 003 // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ 004 005 package graphlab.plugins.commandline.parsers; 006 007 008 import graphlab.plugins.commandline.Shell; 009 010 import java.util.HashMap; 011 import java.util.HashSet; 012 013 /** 014 * @author Mohammad Ali Rostami 015 * @email ma.rostami@yahoo.com 016 */ 017 018 public class DefaultParser implements ExtParser { 019 HashMap<String, String> methods = new HashMap<String, String>(); 020 boolean is_initialized = false; 021 Shell shell; 022 023 public DefaultParser(Shell shell) { 024 this.shell = shell; 025 } 026 027 028 public String getName() { 029 return "default parser"; 030 } 031 032 String clearStringOfNewline(String s) { 033 for (int i = 0; i < s.length(); i++) { 034 if (s.charAt(i) == '\n') { 035 String t = s.substring(0, s.indexOf('\n')); 036 if (s.indexOf('\n') != -1 037 && s.indexOf('\n') + 1 <= s.length()) 038 s = t + s.substring(s.indexOf('\n') + 1); 039 else 040 s = t; 041 } 042 } 043 return s; 044 } 045 046 public int count(String s, char c) { 047 int count = 0; 048 for (int i = 0; i < s.length(); i++) 049 if (s.charAt(i) == c) count++; 050 return count; 051 } 052 053 public String correct(String s) { 054 if (!s.contains("(")) return s; 055 for (int i = 0; i < s.length(); i++) { 056 if (s.charAt(i) == '(') { 057 int fp, ep; 058 if (s.substring(0, i).contains(",")) { 059 fp = s.substring(0, i).lastIndexOf(",") + 1; 060 if (s.substring(fp, i).contains("[")) 061 fp = fp + s.substring(fp, i).lastIndexOf("[") + 1; 062 } else if (s.substring(0, i).contains("[")) fp = s.lastIndexOf("[") + 1; 063 else fp = 0; 064 ep = eatExtra(s, i, '(', ')'); 065 066 Object o = eval(s.substring(fp, ep + 1)); 067 String t1; 068 if (o instanceof String) 069 t1 = s.substring(0, fp) + "\"" + o + "\""; 070 else t1 = s.substring(0, fp) + o; 071 String t2 = ""; 072 if (ep != s.length()) t2 = s.substring(ep + 1); 073 s = t1 + t2; 074 i = t1.length(); 075 076 } 077 } 078 return s; 079 } 080 081 Object eval(String s) { 082 shell.evaluate("___ = " + s.trim() + ";"); 083 return shell.get("___"); 084 } 085 086 public Object[] parseSet(String sets) { 087 sets = sets.trim(); 088 HashSet set = new HashSet(); 089 boolean aa = false; 090 091 if (!sets.contains(",") && !sets.contains("[")) { 092 shell.evaluate("___ = " + sets.trim()); 093 set.add(shell.get("___")); 094 return set.toArray(); 095 } 096 097 for (int i = 0; i < sets.length(); i++) { 098 099 if (sets.charAt(i) == '[') { 100 String t = sets.substring(i); 101 int j = eatExtraBracket(t, 0); 102 set.add(parseSet(sets.substring(i + 1 103 , i + j))); 104 if (!sets.substring(i + 1).contains(",")) 105 aa = true; 106 i = i + j; 107 108 aa = true; 109 } 110 111 if (sets.charAt(i) == ',') { 112 if (sets.substring(0, i).contains(",")) { 113 String s = "___ = " 114 + sets.substring 115 ( 116 sets.substring(0, i).lastIndexOf(',') + 1 117 , i).trim(); 118 shell.evaluate(s); 119 } else { 120 String s1 = "___ = " 121 + sets.substring(0 122 , i).trim(); 123 shell.evaluate(s1); 124 } 125 set.add(shell.get("___")); 126 } 127 } 128 if (!aa) { 129 String iii = sets.substring(sets.lastIndexOf(",") + 1); 130 shell.evaluate("___ = " + iii.trim()); 131 set.add(shell.get("___")); 132 } 133 return set.toArray(); 134 } 135 136 137 public void initialize() { 138 shell.set_variable("temp_this", this); 139 shell.evaluate("Object[] parseSet(String s) {" + 140 "s = temp_this.correct(s);" + 141 "return temp_this.parseSet(s);" + 142 "}"); 143 //methods.put("graph", "graph(String s){print(s);}"); 144 } 145 146 147 public void add(String name, String method) { 148 shell.evaluate(method); 149 } 150 151 public int eatExtraBracket(String s, int start) { 152 return eatExtra(s, start, '[', ']'); 153 } 154 155 public int eatExtra(String s, int start, char c1, char c2) { 156 int lb = 1, rb = 0; 157 for (int i = start + 1; i < s.length(); i++) { 158 if (s.charAt(i) == c1) lb++; 159 if (s.charAt(i) == c2) rb++; 160 if (lb == rb) return i; 161 } 162 return -1; 163 } 164 165 public String parse(String statement) { 166 if (statement.startsWith("[")) return ";"; 167 statement = clearStringOfNewline(statement); 168 if (!is_initialized) initialize(); 169 if (statement.contains("[")) { 170 int bracketIndex = statement.indexOf("["); 171 String p = statement.substring(0, bracketIndex); 172 p = p.trim(); 173 if (p.length() != 0) { 174 if (p.charAt(p.length() - 1) == '=' 175 || p.charAt(p.length() - 1) == '(' || p.charAt(p.length() - 1) == ',') { 176 int rbracet = eatExtraBracket(statement, bracketIndex); 177 statement = 178 statement.substring(0, bracketIndex) 179 + 180 "parseSet(\"" 181 + 182 statement.substring(bracketIndex + 1 183 , rbracet) 184 + "\")" + statement.substring(rbracet + 1); 185 } 186 } 187 } 188 // System.out.println("modifying statement: " + statement); 189 return statement; 190 } 191 }