[ANTLR] Lexical non-determinism

Lexical non-determinism [ANTLR] - Java - Programmation

Marsh Posté le 16-04-2005 à 17:58:29    

Salut, voila j'ai un probleme avec le lexer de antlr (pour java). Je voudrais pouvoir specifier deux tokens distincts ENTIER et FLOTTANT qui sont tout à fait valables dans d'autres lexers.
 

Code :
  1. ///////////////////////////////////////////////////////
  2. protected
  3. CHIFFRE :        '0'..'9' ;
  4. ///////////////////////////////////////////////////////       
  5. ENTIER :        (CHIFFRE)+ ;
  6. ///////////////////////////////////////////////////////
  7. FLOTTANT:        ENTIER '.' ENTIER ;
  8. ///////////////////////////////////////////////////////


 
Et j'ai l'erreur suivante :
 

Citation :


ANTLR Parser Generator   Version 2.7.5 (20050201)   1989-2005 jGuru.com
test.g: warning:lexical nondeterminism between rules ENTIER and FLOTTANT upon
test.g:     k==1:'0'..'9'


 
 
Quelqu'un as t'il deja rencontré se probleme dans antlr ?


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 16-04-2005 à 17:58:29   

Reply

Marsh Posté le 17-04-2005 à 20:12:55    

N'utilisez pas se parseur ! Il pue (faut une grammaire EBNF pour que ca marche) ! JavaCUP est 10 fois mieux !
 
EDIT : C'est du LL(k) cette grosse DAUBE ! :fou:  :fou:  :fou:


Message édité par Chronoklazm le 17-04-2005 à 21:12:38

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 18-04-2005 à 14:19:43    

un bel avis d'expert que nous avons là [:totozzz]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 18-04-2005 à 14:27:27    

met ton k à 2, ca devrait passer.

Reply

Marsh Posté le 18-04-2005 à 14:38:08    

Mon k est à 7 pour le parser et à 4 pour le lexer. Le probleme n'est pas là.  
 
Ce parseur est en LL(k) recurive gauche, cette approche est beacoup plus restrictive que du LALR(1) comme YACC ou BISON.  
 
On ne peut y pas preciser les priorites sur les operateurs donc pour s'en sortir il faut avoir une grammaire dans laquelle les priorités sont IMPLICITES. Ce qui est "un poil" contraignant.


Message édité par Chronoklazm le 18-04-2005 à 14:39:04

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 18-04-2005 à 15:16:32    

Code :
  1. header {
  2. package zzz.test;
  3. }
  4. class TestLexer extends Lexer;
  5. options {
  6. k=1; // 1 Token look ahead
  7. }
  8. ///////////////////////////////////////////////////////  
  9. protected
  10. CHIFFRE    :        '0'..'9'    ;
  11. ///////////////////////////////////////////////////////   
  12. protected   
  13. ENTIER    :        (CHIFFRE)+    ;
  14. ///////////////////////////////////////////////////////  
  15. protected
  16. FLOTTANT:         ENTIER '.' ENTIER ;
  17. ///////////////////////////////////////////////////////
  18. ENTIER_OR_FLOTTANT:
  19.  (ENTIER '.') => FLOTTANT {$setType(FLOTTANT);}
  20.  | ENTIER {$setType(ENTIER);}
  21. ;
  22. class TestParser extends Parser;
  23. parse:
  24.  ENTIER_OR_FLOTTANT
  25. ;


c'est vrai que c'est un poil contraignant [:kiki]


Message édité par gizmo le 18-04-2005 à 15:16:48
Reply

Marsh Posté le 18-04-2005 à 17:00:01    

Moi je recupere simplement un token NOMBRE : (DIGIT)+ ('.' ((DIGIT)+))? ; et dans le TreeWalker je fait la difference si il y un point ou pas ...
 
Pour ce qui est de "un poil contraignant" : je parlais surtout du PARSER et pas du LEXER.
 
C'est carrement moins intuitif et plus dur de faire une grammaire reconnue LL(k) que d'en faire une LALR(1) ...  :hello:
 
EDIT : Exemple du probleme du "-" et "+" uniare ... faut creer des token imaginaires, renommer les "-" et "+" binaires, verifier que les priorites dans ta grammaires sont bonnes ... enfin tout un blbla alors qu'avec bison tu donne juste la priorité tu le fout n'importe ou et on en parle plus.


Message édité par Chronoklazm le 18-04-2005 à 17:06:13

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 18-04-2005 à 17:03:19    

bah oui, bah c'est pas plus ou moins intuitif qu'un autre. Ca dépend juste de la manière dont on t'a appris à penser les grammaires.

Reply

Marsh Posté le 21-04-2005 à 20:33:52    

Hoy ! Toi qui à l'air de gerer ANTLR, dis moi pourquoi ca explose ca ?  
 

Code :
  1. AST test = (AST)(new CommonAST((Token)(new CommonToken(INT,"3" ))));
  2.   test.setFirstChild(test);
  3.   (test.getFirstChild()).setNextSibling(test);
  4.   System.out.println("____________________________> " + test.toStringTree());


 
Ca balance une exception : antlr.BaseAST.toStringList(BaseAST.java:342)
 
J'en peux plus là ... 6 heures de squattage sur des problemes comme ca, y a de quoi s'aligné tous les gars de ANTLR à la Kalash  :fou:  :fou:  :fou:


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 21-04-2005 à 21:48:53    

Faudrait que je regarde le code d'antlr pour être sûr, mais j'ai l'impression qu'il essaye simplement d'éviter un cycle.


Message édité par gizmo le 21-04-2005 à 21:49:09
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed