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    }