Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Expressions régulières Java !! Help !! [ Algorithme / Autre ] (lolo80000)

mercredi 23 avril 2008 à 17:35:06 | Expressions régulières Java !! Help !!

lolo80000

Bonjour à tous,

Voila j'ai un peit souci que je n'arrive pas à resoudre, voila j'ai une chaine de caractère du type "65*22/12-6+2..." et j'aimerai effectuer cette opération, j'ai donc pensé à utiliser les expressions regulières pour separer la chaine par rapport aux opérateurs ! mais je n'y arrive pas.

Si vous pouviez m'aider.

Merci à tous

Laurent.

mercredi 23 avril 2008 à 18:02:30 | Re : Expressions régulières Java !! Help !!

jojolemariole

Je te conseillerais d'utiliser plutôt un générateur de parser, du style javacc.
lien pour windows : https://javacc.dev.java.net/files/documents/17/26777/javacc-4.0.zip

Il s'agit principalement d'un jar, d'exemples, de doc et d'un bat pour appeler le parser sans se taper la ligne de commande java -jar en entier.

Je l'ai utilisé et je ne peux que te le conseiller. Le problème c'est que pour écrire la grammaire, il te faut des connaissances en compilation. Ou alors tu trouves une grammaire toute faite qui te convient.

1) D'abord tu écris tes classes métiers. Dans ton cas c'est simple.

Tu fais une interface expression avec une méthode évaluer qui renvoit un nombre. (int, double, ... ce que tu veux)

et tu dois faire au moins 7 implémentations de cette classe. A savoir :
class ExpressionNombre implements Expression
class ExpressionAddition implements Expression
....

Bien sûr une addition aura deux attributs de type Expression.
Du coup l'implémentation de la méthode evaluer pour la classe ExpressionAddition donne :

public int evaluer(){
    return expressionGauche.evaluer() + expressionDroite.evaluer();
}

etc...

Tu dois prévoir aussi des setters et des getters pour tous les attributs de tes Expression afin de pouvoir construire une expression complexe (n'oublie pas les expression parenthésées et les moins unaires (-5 par exemple)).

Ensuite tu dois écrire un fichier grammaireExpression.jj où tu vas écrire la grammaire d'une expression. C'est-à-dire la façon dont s'écrit une expression correcte. J'ai un exemple que j'ai fait y'a un moment sous la main :

Exemple de grammaire.jj



options{
    STATIC = false;
}

PARSER_BEGIN(ParserExpression)

package parsing.expression;

import expressions.*;
import java.util.LinkedList;

public class ParserExpression{}

PARSER_END(ParserExpression)

SKIP :
{
        " "
    |    "\t"
    |    "\n"
    |    "\r"
}

TOKEN :
{

        <PLUS: "+">
    |    <FOIS: "*">
    |    <MOINS: "-">
    |    <DIVISE: "/">
    |    <PARO: "(">
    |    <PARF: ")">
    |    <POINT: ".">
    |    <NOMBRE: ["0"-"9"](["0"-"9"])*(<POINT>(["0"-"9"])*)?>
    |    <VIRGULE: ",">
}




InterfaceExpression compile() :
{   
    InterfaceExpression expressionArithmetique;
}
{
    expressionArithmetique = expressionPlusMoins()
    { return expressionArithmetique; }
}


InterfaceExpression expressionPlusMoins() :
{
    InterfaceExpression expressionPlusMoins = null;
    InterfaceExpression expressionDroite;
}
{
    expressionPlusMoins = expressionFoisDiv()
    (
            <PLUS> expressionDroite = expressionFoisDiv()
            { expressionPlusMoins = new ExpressionPlus(expressionPlusMoins, expressionDroite); }
       
        |    <MOINS> expressionDroite = expressionFoisDiv()
            { expressionPlusMoins = new ExpressionMoins(expressionPlusMoins, expressionDroite); }
    )*
    { return expressionPlusMoins; }
}


InterfaceExpression expressionFoisDiv() :
{
    InterfaceExpression expressionFoisDiv = null;
    InterfaceExpression expressionDroite;
}
{
    expressionFoisDiv = expressionMoinsUnaire()
    (
            <FOIS> expressionDroite = expressionMoinsUnaire()
            { expressionFoisDiv = new ExpressionFois(expressionFoisDiv, expressionDroite); }
       
        |    <DIVISE> expressionDroite = expressionMoinsUnaire()
            { expressionFoisDiv = new ExpressionDivise(expressionFoisDiv, expressionDroite); }
    )*
    { return expressionFoisDiv; }
}


InterfaceExpression expressionMoinsUnaire() :
{
    InterfaceExpression expressionInterne;
}
{
    (
            <MOINS> expressionInterne = expressionTerminale()
            { return new ExpressionMoinsUnaire(expressionInterne); }
        |    expressionInterne = expressionTerminale()
            { return expressionInterne; }
    )
   
}




InterfaceExpression expressionTerminale() :
{
    Token t;
    LinkedList<InterfaceExpression> parametres;
    InterfaceExpression expressionInterne;
}
{
   
    (
       
            t = <NOMBRE> { return new ExpressionNombre(t.image); }
        |    <PARO> expressionInterne = expressionPlusMoins() <PARF>
            { return new ExpressionParenthesee(expressionInterne); }
    )
}


Avec un peu de chance, en recopiant simplement cette grammaire et en faisant la partie métier compatible (observe comment sont construites les expressions dans la grammaire), tu dois t'en sortir.

Pour générer le Parser, il te suffit de compiler la grammaire à l'aide de javacc.
Pour cela tu ouvres une console de commandes, tu te positionnes dans le repertoire où tu as décompressé javacc et tu tapes :
javacc grammaire.jj

si ya pas d'erreurs, ça te donne quelques fichiers que tu peux inclure dans ton projet, le plus important étant le parser en lui-même, il porte le nom de la classe définie dans ta grammaire. Dans mon exemple c'est ParserExpression.java.

Pour l'utiliser c'est simple :

ParserExpression p = new ParserExpression(new StringReader("3 * (1+2)"));
ExpressionArithmetique exp = p.compile();
System.out.prinln(exp.evaluer());

Voilà, je ne sais pas si tu es familier avec les concepts de compilation, mais dans tous les cas, oriente-toi vers cette solution. Ce sera peut-être un petit effort à fournir au début, mais le jeu en vaut la chandelle car les expression régulières ont leurs limites.

N'hésite pas à reposter si tu es bloqué quelque part.



Cette discussion est classé dans : help, java, arrive, expressions, régulières


Répondre à ce message

Sujets en rapport avec ce message

java et expressions régulières [ par manal906 ] Bonjour, Je cherche un programme en java qui supprime les balises HTML d'un fichier et garde le contenu (du fichier HTML) dans un autre fichier et cel J'arrive pas à utiliser le SDK ! [ par LePROduHTML ] J'ai installé la machine Java avec le SDK sur mon PC mais je n'arrive pas à compiler les programmes. L'invite de commandes me renvoi 'javac' n'est pas HELP jfreechart [ par sebban ] Voila je suis en train de mettre en place sur une apli. JSP des graph...une fois le code crée testé....en local tout est NIKEL, le soucis c 'est lorsq buffer clavier help !! [ par ratp ] Bonjour à vous. Voila je débute en java, et j'ai appris que java ne peux pas gérer la saisie aux clavier. j'aimerai savoir comment faire pour introdu HELP: debuts avec JDK !?!?!? [ par alonsyl ] bonjour,aujourd'hui j'ai essaye de me mettre. ca fait 2 heures que j'y suis et j'ai tjrs pas reussi a interpreter 1 ligne de code !j'ai installer le t Help [ par Poulpx ] voila je suis bien embèté j'utilise la libraire jd3lib et je n'arrive pas a sauvegarder les modification fait dans les tag car je n'arrive pas a utili HELP...RECUPERATION DES DONNES DES SITES A PARTIR D UN PROGRAMME JAVA [ par kenza_sana ] Bonjour j'aimerai réaliser un programme java qui accéde a une liste de site de faculté et par exemple me récupére la lise des professeur d'informatiqu Mon projet java [ par slitijava ] slt tout le monde jé un gro pb en fait jé un projet à réaliser en java et j'arrive pas à avancer.  et qui a pour sujet simulation d'un rézo éléctrique JFreeChart JApplet [ par Saris ] Salut à tous, Je n'arrive pas à faire fonctionner un exemple de graphique ("DynamicDataDemo3") de chez JFreeChart via une JApplet...J'y arrive lorsque probleme de l'aide en ligne d'une application swing [ par yayamo ] bonjour,j'ai une  application ecrit en java sous eclipse; j'arrive à executer l'application et le help en local. Par contre, lorsque je execute l'appl


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.