Explorar o código

Ajout parser list

Arthur Brandao %!s(int64=6) %!d(string=hai) anos
pai
achega
889075597e
Modificáronse 1 ficheiros con 33 adicións e 14 borrados
  1. 33 14
      src/migl/lisp/LispImpl.java

+ 33 - 14
src/migl/lisp/LispImpl.java

@@ -3,6 +3,9 @@ package migl.lisp;
 import java.math.BigInteger;
 import java.util.Stack;
 
+import migl.util.ConsList;
+import migl.util.ConsListFactory;
+
 public class LispImpl implements Lisp {
 
 	@Override
@@ -13,7 +16,6 @@ public class LispImpl implements Lisp {
 		 * E = bool | entier | decimal | string
 		 * F = '('X*')'
 		 */
-		// TODO Auto-generated method stub
 		Stack<String> explode = this.explode(expr);
 		while(explode.size() > 0) {
 			String val = explode.remove(0);
@@ -46,14 +48,21 @@ public class LispImpl implements Lisp {
 		String[] tmp = expr.split("[ |\t]");
 		Stack<String> result = new Stack<>();
 		for(String str : tmp) {
-			if(str.charAt(0) == '(') {
-				result.add("" + str.charAt(0));
-				result.add(str.substring(1));
-			} else if(str.charAt(str.length() - 1) == ')'){
-				result.add(str.substring(0, str.length() - 2));
-				result.add("" + str.charAt(str.length() - 1));
-			} else {
-				result.add(str);
+			if(str.length() > 0) {
+				if(str.charAt(0) == '(') {
+					result.add("" + str.charAt(0));
+					if(str.charAt(str.length() - 1) == ')') {
+						result.add(str.substring(1, str.length() - 1));
+						result.add("" + str.charAt(str.length() - 1));
+					} else {
+						result.add(str.substring(1));
+					}
+				} else if(str.charAt(str.length() - 1) == ')'){
+					result.add(str.substring(0, str.length() - 2));
+					result.add("" + str.charAt(str.length() - 1));
+				} else {
+					result.add(str);
+				}
 			}
 		}
 		return result;
@@ -86,12 +95,22 @@ public class LispImpl implements Lisp {
 		return val;
 	}
 	
-	private Object parseList(Stack<String> pile) {
-		String val = "";
-		while(pile.size() > 0 && val.equals(")")) {
-			
+	private Object parseList(Stack<String> pile) throws LispError {
+		ConsList<Object> list = ConsListFactory.nil();
+		String val = pile.remove(0);
+		while(pile.size() > 0 && !val.equals(")")) {
+			if(val.equals("(")) {
+				list = list.append(this.parseList(pile));
+			} else {
+				list = list.append(this.parseElement(val));
+			}
+			val = pile.remove(0);
 		}
-		return null;
+		//Si arret cause pile vide erreur
+		if(!val.equals(")")) {
+			throw new LispError("Invalid Format");
+		}
+		return list;
 	}
 
 }