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…