Parenthésage d'une expression

Bonjour,

J’essaie de faire un programme qui vérifie qu’une expression est bien parenthésée.
J’ai un erreur à l’éxecution:

Exception in thread « main » java.lang.ArrayIndexOutOfBoundsException: -1
at PileArray.pop(PileArray.java:
at Parenthesage.verifiParen(Parenthesage.java:)
at Parenthesage.main(Parenthesage.java:)

Je vois pas d’où vient le problème.
Je vous envoie mon code ci-dessous(qui fait 3 fichiers .java).
Quelqu’un pourrait m’aider?

Merci beaucoup d’avance


//INTERFACE STACK
public interface Stack 
{
	public Object push(Object i);
	public Object pop() ;
	public boolean isEmpty();
}



//CLASSE PILEARRAY
import java.util.EmptyStackException;

class PileArray implements Stack 
{
	Object[] pile;
	static int compteur=0;
	int debut;
	
	public PileArray() 
	{
		pile= new Object[10];
		debut=-1;
	}

	
	public boolean isEmpty() 
	{
		return debut == -1;
	}
	
	
	public Object push(Object item) 
	{
		if(debut 1 < 10)
		{			
			pile[ debut] = item;
		}	
		
		return item;
	} 
	

	public Object pop() 
	{
		debut--;
			
		return pile[debut];
		
	}
}


//CLASSE PARENTHESAGE
import java.io.*;
 
 public class Parenthesage 
 {
 
 public static boolean verifiParen(String s) 
 {
 PileArray stack = new PileArray (); 
 
 for (int i = 0; i < s.length(); i ) 
 {
 switch (s.charAt(i)) 
 {
 case '(':
					stack.push(new Character ('('));
					
 break;
 case '[':
					stack.push(new Character ('['));
 break;
 
 case '{':
					stack.push(new Character ('{'));
 
 break;
 case ')':
					if (stack.isEmpty()) return false;
					Character c = (Character)stack.pop();
					if (!match(c.charValue(), s.charAt(i))) return false;
 break;
 case ']':
				
					if (stack.isEmpty()) return false;
 c = (Character)stack.pop();
					if (!match(c.charValue(), s.charAt(i))) return false;
					
 break;
 case '}':
					if (stack.isEmpty()) return false;
 c = (Character)stack.pop();
					if (!match(c.charValue(), s.charAt(i))) return false;
					
 break;
 default:
 break;
 }
 }
 
 if (stack.isEmpty())
	{
		return true;
		
	}
	else 
		return false ;
 
 }
 
 
 public static boolean match(char lpar, char rpar) {
 switch (lpar) {
 case '(': return rpar == ')';
 case '[': return rpar == ']';
 case '{': return rpar == '}';
 default: return false;
 }
 }
 
 public static void main(String[] args) throws IOException {
 BufferedReader stdr; 
 stdr = new BufferedReader(new InputStreamReader(System.in));
 
 String line = stdr.readLine(); 
 while (line != null) {
 if (verifiParen(line))
 System.out.println("well parenthesized");
 else
 System.out.println("parenthesis mismatch");
 
 line = stdr.readLine(); 
 }
 }
 }

Heu… Il aurai été plus judicieux de :

1 - laisser les numéros de ligne
2 - indiquer la donnée qui provoque l’erreur.


[quote="Martopioche"] Heu... Il aurai été plus judicieux de :

1 - laisser les numéros de ligne
2 - indiquer la donnée qui provoque l’erreur.
[/quote]
et
3 - quelles sont tes classes de test ?
4 - t’a rien au débuggeur ?

J’espère que tu utilises bien la classe Stack de l’API Java? :slight_smile:

Ensuite, si tu es en Java 1.6 (et si tu ne l’es pas, passes y), tu n’as pas besoin de faire new Character(‹ ( ›), l’auto boxing marche aussi sur les chars.

Et pour ton problème, c’est que tu fais le con :

public Object pop() {
	debut--;			
	return pile[debut];		
}

Que se passe-t’il si debut = -1 ? Ben une belle ArrayIndexOutOfBoundsException car -1 n’est pas entre 0 et pile.length tout bonnement…