IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI et Outils pour Java Discussion :

[ANTLR]gérer des mots réservés


Sujet :

EDI et Outils pour Java

  1. #1
    Membre confirmé Avatar de anitshka
    Inscrit en
    Mai 2004
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 624
    Points : 605
    Points
    605
    Par défaut [ANTLR]gérer des mots réservés
    salut

    Déjà j'espère que je poste au bon endroit... je m'y perd un peu avec tous ces sous forums ...

    Je suis en train de faire joujou avec ANTLR et j'ai un soucis de récursion infinie... Erreur de newbie, mais je ne m'en sors pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    REMOVE          : "remove"  { System.out.println("Found REMOVE: "+getText()); $setType(Token.SKIP);} |
    REMOVEAT          : "removeAt"  { System.out.println("Found REMOVEAT: "+getText()); $setType(Token.SKIP);} |
    voila je voudrais faire co-exister ces 2 mots mais ... lorsqu'il tombe sur le token "remove" il ne cherche pas plus loin que la règle REMOVE ...
    Que faire?
    d'avance
    Ni Dieu, ni maître, mais des frites bordel!

  2. #2
    Membre confirmé Avatar de anitshka
    Inscrit en
    Mai 2004
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 624
    Points : 605
    Points
    605
    Par défaut
    bon je continue....
    J'ai trouver une piste mais ca ne me tente pas vraiment
    voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    REMOVE
      :  ('r' 'e' 'm' 'o' 'v' 'e' 'A' 't') => "removeAt"
            {
                System.out.println("Found REMOVEAT: "+getText());
                $setType(Token.SKIP);
                //$setType(REMOVEAT);
            }
         |"remove"
            {
                System.out.println("Found REMOVE: "+getText());
                $setType(Token.SKIP);
                //$setType(REMOVE);
            }
      ;
    ca fonctionne mais c'est vraiment pas joli
    personne pour un peu d'aide ?
    Ni Dieu, ni maître, mais des frites bordel!

  3. #3
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Garde ta 1° solution et ajoute l'option

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    options {
        k = 2;
    }
    Juste pour voir !

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  4. #4
    Membre confirmé Avatar de anitshka
    Inscrit en
    Mai 2004
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 624
    Points : 605
    Points
    605
    Par défaut
    j'avais testé...
    mais même avec k = 10 ca ne passait pas ...
    Ni Dieu, ni maître, mais des frites bordel!

  5. #5
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    et si tu fais comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    tokens {
      REMOVE = "remove";
      REMOVEAT = "removeAt";
    }
     
    SYMBOL
      options { testLiterals = true; }
      : ('a'..'z' | 'A'..'Z')+;

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  6. #6
    Membre confirmé Avatar de anitshka
    Inscrit en
    Mai 2004
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 624
    Points : 605
    Points
    605
    Par défaut
    Citation Envoyé par MarneusCalgarXP
    et si tu fais comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    tokens {
      REMOVE = "remove";
      REMOVEAT = "removeAt";
    }
     
    SYMBOL
      options { testLiterals = true; }
      : ('a'..'z' | 'A'..'Z')+;
    je croyais que l'utilisation du bloc tokens permettait uniquement de déclarer des mot "symbolique" permettant par la suite de créer des node lorsque tu es en format AST
    Ni Dieu, ni maître, mais des frites bordel!

  7. #7
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    pas uniquement ^^ En tous cas, quand je teste, ca fonctionne !

    test.g, à placer dans un package test.antlr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    header {
    	package test.antlr;
    }
    
    class ExprLexer extends Lexer;
    
    options {
        k=2; // needed for newline junk
    	testLiterals = false; 
    }
    
    tokens {
    	REMOVE 		= "remove";
    	REMOVEAT 	= "removeAt";
    }
    
    SYMBOL
      options { testLiterals = true; }
      : ('a'..'z' | 'A'..'Z')+;
    
    WS    : ( ' '
            | '\r' '\n'
            | '\n'
            | '\t'
            )
            {$setType(Token.SKIP);}
          ;
    Main.java, à placer dans un package test.main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package test.main;
    
    import java.io.ByteArrayInputStream;
    
    import antlr.Token;
    import antlr.TokenStreamException;
    
    import test.antlr.ExprLexer;
    
    public class Main {
    
    	/**
    	 * @param args
    	 * @throws TokenStreamException 
    	 */
    	public static void main(String[] args) throws TokenStreamException {
    		String text = "toto removeAt titi remove tata";
    		ByteArrayInputStream input = new ByteArrayInputStream( text.getBytes() );
    		ExprLexer lexer = new ExprLexer(input);
    		
    		Token token = lexer.nextToken();
    		while (token.getText() != null)
    		{
    			System.out.println(token);
    			token = lexer.nextToken();
    		};  
    	}
    
    }
    Le fichier test.g génère le ficiher ExprLexerTokenTypes suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public interface ExprLexerTokenTypes {
    	int EOF = 1;
    	int NULL_TREE_LOOKAHEAD = 3;
    	int REMOVE = 4;
    	int REMOVEAT = 5;
    	int SYMBOL = 6;
    	int WS = 7;
    }
    et quand on execute le programme, on a bien le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ["toto",<6>,line=1,col=1]
    ["removeAt",<5>,line=1,col=6]
    ["titi",<6>,line=1,col=15]
    ["remove",<4>,line=1,col=20]
    ["tata",<6>,line=1,col=27]

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  8. #8
    Membre confirmé Avatar de anitshka
    Inscrit en
    Mai 2004
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 624
    Points : 605
    Points
    605
    Par défaut
    ok j'ai testé ca a l'air de fonctionner
    J'ai encore un problème avec ma grammaire... si je rajoute une condition qui me permet de tout interpréter, il n'arrive plus a me détecter la fin de texte... et la c'est génant car il repart dans une analyse et donc plante car il essaye de parser la chaine vide "" en integer... oh la joli java.lang.NumberFormatException: For input string: "" qui arrive !

    Le plus rageant c'est qu'il arrive a construire tout mes objets en les interprétant bien (y compris les dernières expressions qui )... je sais pas comment me dépatouiller de ce problème... tu utilises un outil particulier pour debbuger ton antlr ou tu le fais a la bonne vieille méthode ?
    Ni Dieu, ni maître, mais des frites bordel!

  9. #9
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    si c'est pour le Parser, tu as le token automatique EOF qui existe et qui marque la fin de ton texte !!! même pas besoin de le déclarer, il existe c'est tout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    expr : REMOVE toto;
    exprtotal : expr EOF;
    sinon j'utilise juste le plugin ANTLR pour Eclipse et comme ça fait 2 jours que je me casse les dents dessus je commence à apprendre des trucs petit à petit

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  10. #10
    Membre confirmé Avatar de anitshka
    Inscrit en
    Mai 2004
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 624
    Points : 605
    Points
    605
    Par défaut
    moi je suis sans filet ... je ne travaille pas sous eclipse donc pas de plug-in donc que du fichier text... galère galère...

    j'avais deja tester le EOF... le problème venait d'ailleurs, je devais faire un lookhead sur mes literaux d'entree... maintenant ca marche

    Ni Dieu, ni maître, mais des frites bordel!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment gérer des mots clés ?
    Par Apranax dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/07/2014, 22h01
  2. [Batch] Variable texte contenant des mots réservés
    Par canorra dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 10/09/2012, 16h02
  3. [Toutes versions] Mots réservés pour les expressions des macros
    Par damsmut dans le forum IHM
    Réponses: 3
    Dernier message: 14/01/2010, 20h06
  4. la liste des mots clés réservés de PYTHON ?
    Par clavier12AZQSWX dans le forum Général Python
    Réponses: 2
    Dernier message: 25/05/2009, 22h15
  5. Réponses: 2
    Dernier message: 10/10/2006, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo