Expression bien parenthésée

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 120 fois - Téléchargée 19 fois

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

Ajouter un commentaire Commentaire
Messages postés
215
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
10 mars 2014

slt
il faut toujours mettre des commentaires dans une souce aue ce soit pour expliquer ce que fait la fonction ou expliquer le role des variable ...

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)