|
@@ -1,6 +1,9 @@
|
|
package migl.lisp;
|
|
package migl.lisp;
|
|
|
|
|
|
import java.math.BigInteger;
|
|
import java.math.BigInteger;
|
|
|
|
+import java.util.LinkedList;
|
|
|
|
+import java.util.PriorityQueue;
|
|
|
|
+import java.util.Queue;
|
|
import java.util.Stack;
|
|
import java.util.Stack;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
import java.util.regex.Pattern;
|
|
@@ -17,9 +20,9 @@ public class LispImpl implements Lisp {
|
|
throw new LispError("Invalid Format");
|
|
throw new LispError("Invalid Format");
|
|
}
|
|
}
|
|
//Explose l'expression
|
|
//Explose l'expression
|
|
- Stack<String> explode = this.explode(expr);
|
|
|
|
|
|
+ Queue<String> explode = this.explode(expr);
|
|
//Analyse le type d'expression
|
|
//Analyse le type d'expression
|
|
- String val = explode.remove(0);
|
|
|
|
|
|
+ String val = explode.poll();
|
|
if("(".equals(val)){
|
|
if("(".equals(val)){
|
|
return this.parseList(explode);
|
|
return this.parseList(explode);
|
|
} else {
|
|
} else {
|
|
@@ -81,11 +84,11 @@ public class LispImpl implements Lisp {
|
|
/**
|
|
/**
|
|
* Découpe un string pour l'analyse Lisp
|
|
* Découpe un string pour l'analyse Lisp
|
|
* @param expr L'expression à analyser
|
|
* @param expr L'expression à analyser
|
|
- * @return L'expression découper
|
|
|
|
|
|
+ * @return L'expression découpée
|
|
*/
|
|
*/
|
|
- private Stack<String> explode(String expr) {
|
|
|
|
|
|
+ private Queue<String> explode(String expr) {
|
|
String[] tmp = expr.trim().split("[ |\t]");
|
|
String[] tmp = expr.trim().split("[ |\t]");
|
|
- Stack<String> result = new Stack<>();
|
|
|
|
|
|
+ Queue<String> result = new LinkedList<>();
|
|
for(String str : tmp) {
|
|
for(String str : tmp) {
|
|
char[] charArray = str.toCharArray();
|
|
char[] charArray = str.toCharArray();
|
|
StringBuilder builder = new StringBuilder();
|
|
StringBuilder builder = new StringBuilder();
|
|
@@ -117,25 +120,21 @@ public class LispImpl implements Lisp {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Parse une liste en Lisp
|
|
|
|
- * @param pile La pile avec les valeurs parser par explode
|
|
|
|
|
|
+ * Parse une file d'element en Lisp
|
|
|
|
+ * @param queue La file avec les valeurs parser par explode
|
|
* @return Liste d'element
|
|
* @return Liste d'element
|
|
* @throws LispError Format invalide
|
|
* @throws LispError Format invalide
|
|
*/
|
|
*/
|
|
- private Object parseList(Stack<String> pile) throws LispError {
|
|
|
|
|
|
+ private Object parseList(Queue<String> queue) throws LispError {
|
|
ConsList<Object> list = ConsListFactory.nil();
|
|
ConsList<Object> list = ConsListFactory.nil();
|
|
- String val = pile.remove(0);
|
|
|
|
- while(pile.size() != 0 && !")".equals(val)) {
|
|
|
|
|
|
+ String val = queue.poll();
|
|
|
|
+ while(!")".equals(val)) {
|
|
if("(".equals(val)) {
|
|
if("(".equals(val)) {
|
|
- list = list.append(this.parseList(pile));
|
|
|
|
|
|
+ list = list.append(this.parseList(queue));
|
|
} else {
|
|
} else {
|
|
list = list.append(LispElement.valueOf(val).value);
|
|
list = list.append(LispElement.valueOf(val).value);
|
|
}
|
|
}
|
|
- val = pile.remove(0);
|
|
|
|
- }
|
|
|
|
- //Si arret cause pile vide erreur
|
|
|
|
- if(!")".equals(val)) {
|
|
|
|
- throw new LispError("Invalid Format");
|
|
|
|
|
|
+ val = queue.poll();
|
|
}
|
|
}
|
|
return list;
|
|
return list;
|
|
}
|
|
}
|