analyseur syntaxique AIDE SVP !

ramzi ramzi
analyseur syntaxique AIDE SVP !

salut

je veux creer une petite application(interface graphique) qui contient un text area
cette app a pour objectif de verifier le syntaxe d'un text ecrit (comme un compilateur)
quand je fenir a ecrire mon texte un bouton appel un algorithme qui verifie ce qui est ecrit d'apres une petite base de donnee (fichier texte simple par exemple ou un xml)

si quelqu'un a une idee ou un exemple similaire comment former cette algorithme,priere de me sauver avec.

willbback

Bonjour,
2 fois le même sujet en 2 jours, ça doit vraiment être urgent.... Le problème est que je ne comprends pas vriament ni la question ni le problème.
Ecrire une petite application avec un textarea et qui exécute une fonction lors de l'appuie d'un bouton me semble être une fonctionnalité de base. Il existe de nombreux exemples sur ce point.
Le point le plus interressant reste l'analyse syntaxique. Mais la le sujet est vaste. Tout dépend ce que tu entends par "analyse syntaxique". Tout cela ressemble fort à un TP "scolaire", donc je suppose que la syntaxe n'est pas compliquée et vu la demande, ça ressemble beaucoup à un court relativement simple. Si c'est une simple analyse de texte (comptage des mots, des signes etc...), je propose d'utiliser simplement l'objet StringTokenizer ce qui devrait être suffisant. Sinon, il existe un desgin pattern pour faire ce travail qui peut convenir tout à fait, c'est le "pattern interpreter". A consulter.... Voilà en expérant que ça peut t'aider

ramzi ramzi

salut
en faite ce travail est une "tache" d'un projet de fin d'etudes

pour le moment il me faut que de verifier la bonne disposition du code ecrit
comment dire ai je

par exemple j'ai le code suivent: (un code referencemais il existe d'autres)

use ieee;
use ieee.std_logic.all;
....
entity xx is
port(a : in std_logic;
b: out std_logic;)
....

tout ce qui est demandee de moi et mon binome est de verifier la bonne ecriture de ce code ( espacement , retour en ligne, ; ,....)

autrement supposant que dans l'application l'utilisateur ecrit le suivant :

use ieee;
use ieee.std_logic.alll  // ici il oublit le ;
entity xxis // ici il oublit l'espace entre xx est is (xx est un nommage quelconque)
....

donc le programme compile ce qui est ecrit est indique la presence des erreurs et leur lignes...

je suis en train d'essayer de rediger le code , et je veut le poster
je vous signale que je suis debutant en java
ainsi nous somme presse par le temps et je croix que l'etude d'analyse syntaxique prend beaucoup de temps (il nous reste 1 mois et 1/2) et ce qu'une tache du projet

thesuixx

Si j'ai bien compris, tu dois pouvoir analyser du code et rechercher les erreurs dedans, donc la solution serait de:
parser le string contenant tout le texte grace à la methode split("\n");
ainsi, tu recuperes un tableau avec une ligne de texte par cellule
tu split(" ") chaque cellule du tableau et tu ajoutes le resultat du split à un Vector

public void algo(String texte){

Vector<String[]> listePhrases = new Vector<String>();
String[] lignes = texte.split("\n");
for (String ligne : lignes) listePhrases.add(ligne.split(" ");

// ensuite, tu parcours tout les mots un par un
for (String[] ligneTab : listePhrases)
	for (String mot : ligneTab)
		if (isMotCle(mot)){
			// tu recuperes les "regles" du mot 
			// ex: le mot clé "if" doit etre suivi d'une parenthese et on ne doit pas tenir compte des espaces entre "if" et "("
			// tu indiques l'erreur ou tu passes à la suite si il n'y a pas d'erreur
		}

}

public boolean isMotCle(String str){
	// tu parcours la liste des objets de type motsClés et tu recherches un objet ayant pour identifiant str
}
}

pour les regles, tu crées une classe motsClés ayant pour attributs String motClé (qui sert d'identifiant),
ainsi que differents booléens, int ou char (par exemple le charactere qui doit suivre apres le mot clé,...)
et tu crées un instance de la classe motsClés pour chaque mot clé
pour les regles (les variables de la classe motsClés) c'est à toi d'adapter au codage de ton texte à analyser, cette partie est la plus complexe et je peux pas t'aider pour ca

ramzi ramzi
compilateur

salut
voici ce que je fait avant de lire ton reponce


/*
 * Editor.java
 *
 * Created on 17. Mنrz 2008, 17:13
 */
package Interface;

/**
 *
 * @author  RAMZI
 */
public class Editor extends javax.swing.JFrame
{

    /** Creates new form Editor */
    @SuppressWarnings("deprecation")
    public Editor()
    {
        initComponents();
        Compile.setEnabled(false);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        Consol = new javax.swing.JTextArea();
        jScrollPane1 = new javax.swing.JScrollPane();
        Editor = new javax.swing.JEditorPane();
        Compile = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Editor"));

        Consol.setColumns(20);
        Consol.setEditable(false);
        Consol.setRows(5);
        jScrollPane2.setViewportView(Consol);

        Editor.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                Enable_keyReleased(evt);
            }
        });
        jScrollPane1.setViewportView(Editor);

        Compile.setText("Compile");
        Compile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                CompileActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 620, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(Compile)
                .addContainerGap())
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 717, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 316, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(Compile)))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
    private void CompileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CompileActionPerformed

        String Resultat_compile = "";
        String ch1 = null;
        String ch2 = null;
        String[] tab_ref_chaine = {"yxcv b", "asdf", "qwertz", "ramzi"};
        int cont_error = 1;

//verification si l'editor est vide ou nom
        if (Editor.getText().isEmpty())
        {
            Resultat_compile = "Nothing to compile";
        } else
        {
//recuperation de tout le text ecrit dans une chaine de caractere            
            String chaine = Editor.getText();
//le spliter dans un tableau de string
            String[] tab_chaine = chaine.split("\n");
//debarrassement des espaces doublee  //a refaire      
            for (int i = 0; i < tab_chaine.length; i++)
            {
                chaine = "";
                chaine = tab_chaine[i];
                tab_chaine[i] = "";
                for (int j = 0; j < chaine.length(); j++)
                {
                    int cont = chaine.indexOf(" ");
                    ch1 = chaine.substring(cont + 1);
                    if (ch1.indexOf(" ") == 0)
                    {
                        ch1 = ch1.substring(1);
                    }
                    ch2 = chaine.substring(0, cont + 1);
                }
                chaine = ch2 + ch1;
// re remplissage du tableau avec les chaine sans occurences des espaces
                tab_chaine[i] = chaine;
            }
//            for (int i = 0; i < tab_chaine.length; i++)
//            {
//                Resultat_compile = Resultat_compile.concat(tab_chaine[i] + "\n");
//            }
//compilation par rapport a un reference
//            System.out.println("\ntab_chaine[tab_chaine.length-1] :"+tab_chaine[tab_chaine.length-1]);
//            System.out.println("tab_chaine[tab_chaine.length-1].length() :"+tab_chaine[tab_chaine.length-1].length());
//            System.out.println("dernier char de dernier element du tableau :"+tab_chaine[tab_chaine.length-1].substring(tab_chaine[tab_chaine.length-1].length()-1));
            for (int i = 0; i < tab_chaine.length; i++)
            {
//                System.out.println("tab_chaine[" + i + "] :" + tab_chaine[i]);
                if (tab_chaine[i].equals(tab_chaine[tab_chaine.length - 1]))
                {
                    tab_chaine[i] = tab_chaine[i].concat(" ");
                }
                for (int j = 0; j < tab_ref_chaine.length; j++)
                {
//                 System.out.println("extraction d'element "+i+" a comparer avec la ref "+j+" de ref :"+tab_chaine[i]);
                    if (!tab_chaine[i].substring(0, tab_chaine[i].length() - 1).equals(tab_ref_chaine[j]))
                    {
//                     System.out.println("l'element "+tab_chaine[i]+" est different de "+tab_ref_chaine[j]);
                        if (j == tab_ref_chaine.length - 1)
                        {
                            Resultat_compile += "Error in Line(s): "+cont_error+" . ";
                            cont_error += 1;
                        }
                    } else
                    {
//                     System.out.println("l'element "+tab_chaine[i]+" est le meme que "+tab_ref_chaine[j]);
                        Resultat_compile = "Compile Seccessful";
                    }
                }
            }
//System.out.println("nb d'erreur : "+cont_error);
        }
        Consol.append("Compiling...\n");
        Consol.append(Resultat_compile + "\n");
    }//GEN-LAST:event_CompileActionPerformed

    private void Enable_keyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_Enable_keyReleased
        Consol.setText("");
        if (Editor.getText() != "")
        {
            Compile.setEnabled(true);
        }
    }//GEN-LAST:event_Enable_keyReleased

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {

            public void run()
            {
                new Editor().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton Compile;
    private javax.swing.JTextArea Consol;
    private javax.swing.JEditorPane Editor;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    // End of variables declaration//GEN-END:variables
}

note : tu peut compiler ce code pour voir le resultat
"je developpe avec netbeans 6 "

il reste quelques truc tel que :
-le code ne verifie que le dernier element de tab_ref_chaine dans la partie de verification des mots( possible qu'il faut changer le boucle for par while)
- j'arrive pas a concatuner les "cont_error" dans la chaine "Resultat_compile"

thesuixx

//debarrassement des espaces doublee  //a refaire     
            for (int i = 0; i < tab_chaine.length; i++) {
                chaine = "";
                chaine = tab_chaine[i];
                tab_chaine[i] = "";
                for (int j = 0; j < chaine.length(); j++) {
                    int cont = chaine.indexOf(" ");
                    ch1 = chaine.substring(cont + 1);
                    if (ch1.indexOf(" ") == 0) {
                        ch1 = ch1.substring(1);
                    }
                    ch2 = chaine.substring(0, cont + 1);
                }
                chaine = ch2 + ch1;
// re remplissage du tableau avec les chaine sans occurences des espaces
                tab_chaine[i] = chaine;
            }

D'apres ce que j'ai compris, tu veux enlever tout les espaces du string contenu dans tab_chaine[i]
il suffit de faire:
for (int i = 0; i < tab_chaine.length; i++) {
                tab_chaine[i] = tab_chaine[i].replaceAll(" ", "");
            }

Pour les autres problemes, j'ai regardé ton code que tres rapidement donc je peux pas encore te donner de solution maintenant

ramzi ramzi
a propos d'espace

salut

pour les espaces c que je veut exactement est de enlever tout les espaces et les remplacer par un seul espace

c a dire si quel qu'un a taper plus qu'un espace dans une phrase le code enleve l'excee des espaces

pour ton idee a propos du code qui verifie le syntaxe je pense que c'est un bon demarche
je veut essayer a rediger le code de ismotcle....

autre chose :
je ne maitrise pas bien les vecteur (dans les cours je ne trouve pas des exemples expliquee pour ce type de declartion : Vector<String[]> ...
si tu a des lien utils merci de m'envoie...
bonne journee

thesuixx

pour les vector de string, c'est tres simple:

Vector<String> monVect = new Vector<String>();


// ajout d'un String:
monVect.add("bfjsbfgrsdkgnbkrd");
monVect.add("ebfhsebfbsgbjrn,hgtn thn iutnh");
// la gestion par defaut est en FIFO, c-a-d que tous les elements sont rangés par ordre d'ajout

// récuperer un element:
String str = monVect.get(indexDuString);

// enlever un élement:
monVect.remove(indexDuString):
// ou bien
monVect.remove(str);  // enleve le premier element du vecteur qui répond positivement à l'expression booléene monVect.get(i).equals(str)

tu as toutes les methodes sur le site de sun:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html

Pour ton histoire d'espaces, si j'ai bien compris, tu veux enlever les doubles espaces

pour ca tu fais:

//recuperation de tout le text ecrit dans une chaine de caractere           
            String chaine = Editor.getText();
//le spliter dans un tableau de string
            String[] tab_chaine = chaine.split("\n");
//debarrassement des espaces doublee  //a refaire     
            String[] tabMots;
            for (int i = 0; i < tab_chaine.length; i++) {
                tabMots = tab_chaine[i].split(" ");
                tab_chaine[i] = "";
                for (String str : tabMots) if (!str.equals("")) tab_chaine[i]+=str+" ";
            }
ramzi ramzi

ok je veut essayer tout ca
merci

si je trouvera d'autres problemes je les posterai