Expression bien parenthésée

Contenu du snippet

ce code sert à trouver si une chaine de caractère est bien parenthée, le parenthésage avec des "()", des "{}" et des "[]".

Source / Exemple :


/****LEXICO.java****/
public class Lexico 
{
	public enum Token{PAR_OUV, PAR_FERM, CROCH_OUV, CROCH_FERM, ACC_OUV, ACC_FERM, FIN, AUTRE} ;
	String chaine;
public Lexico(String chaine)
{
	this.chaine = chaine;
}
public Lexico.Token getToken(int i)
{
	Token tok;
	
		switch(chaine.charAt(i))
		{
			case '(':
				tok = Lexico.Token.PAR_OUV;
				break;
			case ')':
				tok = Lexico.Token.PAR_FERM;
				break;
			case '[':
				tok = Lexico.Token.CROCH_OUV;
				break;
			case ']':
				tok = Lexico.Token.CROCH_FERM;
				break;
			case '{':
				tok = Lexico.Token.ACC_OUV;
				break;
			case '}':
				tok = Lexico.Token.ACC_FERM;
				break;
			case ';':
				tok = Lexico.Token.FIN;
				break;
			default:
				tok = Lexico.Token.AUTRE;
				break;
		}
	return tok;
}

}
/***PILE.java****/
import java.util.*;
public class Pile 
{
	ArrayList chaine;
	
	
public void empiler(Lexico.Token tok)
{
	chaine.add(tok);
	
}
public Lexico.Token depiler()
{
	if(chaine.size() == 0)
	{
		System.out.println("Mauvais paranthésage");
		System.exit(1);
	}
	Lexico.Token tok = (Lexico.Token)chaine.get(chaine.size()-1);
	chaine.remove(chaine.size()-1);
	return tok;
}
public Lexico.Token sommet()
{
	
	if(chaine.size() == 0)
	{
		System.out.println("Mauvais paranthésage");
		System.exit(1);
	}
	Lexico.Token tok = (Lexico.Token)chaine.get(chaine.size()-1);
	return tok;
	 
		
}
public Pile()
{
	chaine = new ArrayList<Lexico.Token>();
}

}
/***SYNTAX.java*****/
import java.util.*;;
public class Syntax 
{
	String chaine;
	public Syntax(String chaine)
	{
		this.chaine = chaine;
	}
	public boolean analyse()
	{
		Pile heap = new Pile();
		Lexico lex = new Lexico(chaine);
		int i = 0;
		boolean resultat = true;
		Lexico.Token tok = null;
		while(tok != Lexico.Token.FIN)
		{
			tok = lex.getToken(i);
			if(tok == Lexico.Token.PAR_OUV)
				heap.empiler(Lexico.Token.PAR_FERM);
			else if(tok == Lexico.Token.CROCH_OUV)
				heap.empiler(Lexico.Token.CROCH_FERM);
			else if(tok == Lexico.Token.ACC_OUV)
				heap.empiler(Lexico.Token.ACC_FERM);
			else if(tok == Lexico.Token.PAR_FERM)
			{
				if(tok == heap.sommet())
					heap.depiler();
				else 
					resultat = false;
			}
			else if(tok == Lexico.Token.CROCH_FERM)
			{
				if(tok == heap.sommet())
					heap.depiler();
				else 
					resultat = false;
			}
			else if(tok == Lexico.Token.ACC_FERM)
			{
				if(tok == heap.sommet())
					heap.depiler();
				else 
					resultat = false;
			}
		i++;	
		}
		
		return resultat;
	}
	public static void main(String args[])
	{
		System.out.println("Entrer une chaine et terminer par ;");
		Scanner clavier = new Scanner(System.in);
		String chaine = clavier.nextLine();
		Syntax syn = new Syntax(chaine);
		if(syn.analyse()) System.out.println("Bonne analyse!!!");
		else System.out.println("Mauvais paranthésage!!!");
	}
	

}

Conclusion :


j ai pas mis de commentaire parceque j estime que le code est assez claire, très bien programmé.
Il manquerait simplement que j'ajoute la gestion des exceptions au moment de dépiler une pile vide ou bien d'empiler dans un tas plein.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (kkp100)