Je cherche un tuto pour débutant ultra débutant [JLex/CUP] - Java - Programmation
Marsh Posté le 15-09-2004 à 19:25:46
fichier jcup:
(en tres gros, je garanti meme pas que ca compile)
|
Fichier jLex :
|
utilisation :
parser toto = new parser(new Yylex(new FileReader("test.txt" ))); |
Marsh Posté le 15-09-2004 à 19:29:42
apres, bon, c'est sur que c'est mieux si tu sais comment marche une grammaire
Marsh Posté le 15-09-2004 à 19:57:10
m'enfin, c'est limpide
le lex reconnait des token qu'il renvoie a cup
cup verifie que les token qu'il recoit sont en correspondance avec sa grammaire
Marsh Posté le 15-09-2004 à 20:02:24
Sinon ben ptet ca : http://www.epaperpress.com/lexandyacc/
Spa jlex/jcup mais flex/yacc, mais bon, c'est limite assez kif kif
Marsh Posté le 16-09-2004 à 00:48:24
c limpide en théorie : c sur la mise en oeuvre que je voudrais un tuto...
un truc qui va de A à Z, genre tient je me ferais bien un petit parseur jusqu'à la démo de la petit appli qui utilise le parseur...le tout en pas à pas...sur un exemple couillon
Marsh Posté le 16-09-2004 à 00:49:56
il est hautement couillon mon exemple
mais faudrait te renseigner un brin sur les grammaires BNF et LALR1 si tu veux un fond de background
Marsh Posté le 16-09-2004 à 01:03:54
bien, tu pars d'un fichier texte.
ton parser (ecrit en JCup) va le donner a manger a ton lexer (JLex). JLex va le parcourir jusqu'a avoir reconnu un token. Une fois un token reconnu, il arrete la lecture du fichier et rends la main a JCup.
Ici, il n'y a qu'une seule regle pour reconnaitre un token : si il voit "prout" dans le fichier texte, il renvoie 'SB_1' au parser.
Le parser recoit le token emis par lex, et "se deplace" dans sa grammaire grace a ce token. Si jamais il ne peut pas, alors il va se mettre en erreur, mais la ca complique pas mal le souc, on va faire comme si tout marche bien.
La grammaire, now. Une grammaire est composé de deux types d'element : les terminaux et les non terminaux. Pour te simplifier la vision de la chose, un non terminal est une sorte de bidule 'recursif', ou pour employer du voca a tort et a travers, les terminaux sont atomiques. Ma def est pourry, mais peut etre qu'elle t'aidera. Enfin bref, la conclusion de tout cela est qu'il faut expliquer au parser ce qu'est un non terminal, nous y venons :
Prenons le JCup
+J'y défini deux element terminaux SB_1, et SB_2
+j'y défini deux element non terminaux, cBidule et cStart, avec en plus le fait que cBidule renvoie un "Integer", alors que cStart, rien.
Ma grammaire commence par cStart (la directive start with)
cStart::= cBidule:i {: System.out.println(i); :} |
Ici nous y apprenons que le non terminal 'cStart' correspond a un 'cBidule'. Le resultat de ce 'cBidule' la (un Integer, donc), sera placé dans une variable nommé 'i'. Si jamais le parser reconnait cette regle, alors il effectuera le code java compris entre {: et :}
maintenant voyons voir ce qu'est un cBidule
cBidule ::= SB_1 {: RESULT = new Integer(12);} |
un cBidule est un SB_1. le RESULT majuscule est un truc a JCup, c'est la ou on va mettre le resultat de la regle (rapellons que cBidule renvoie un Integer)
Si jamais t'as bien suivi, le fichier de test valide contiendra :
Code :
|
et le resultat a l'ecran, apres parse et execution des regles associés sera :
12 |
Etoffons.
Rajoutons a JLex :
"tata" { return new Symbol(sym.SB_2); } |
et reecrivons nos regle JCup :
|
La regle cStart a changé. une suite de token sera reconnu comme etant 'cStart' si
1/ c'est un cBidule suivi d'un SB_2
2/ c'est un SB_2 seul
donc la les fichier texte valide pour le parseur seront :
prout tata |
ou
tata |
au debut c'est chiant, a la fin on s'y fait et ca devient assez naturel
Marsh Posté le 16-09-2004 à 01:44:40
je lis, édit ensuite
Edit 1 :
si g bien suivi, SB2 sert à rien (il est pas défini dans ton fichier lex)
sinon qd tu dis que le fichier de test valide c
Code :
|
en réalité c que prout ? (le 1. c le numéro de ligne? ...parce que sinon je vois pas où est parsé le 1)
parse() il renvoit quoi ? tt se fait dans cup ?
-->sinon g à peu près compris ton exemple ...maintenant je dois l'appliquer à ca :
Code :
|
J'ai isolé les motifs, ce qui donne :
un dossier est déterminé par : (j'utilise l'italique si c optionnel)
Code :
|
un bookmark est définit par :
[code]
<DT><A ADD_DATE="[date"] LAST_VISIT="[date]" LAST_MODIFIED="[date]"
LAST_CHARSET="[charset]" ICON="[URL]"|ICON="[données binaires]" etc...> nom du bookmark</A>
<DD> description du bookmark
Marsh Posté le 16-09-2004 à 09:27:25
Jubijub a écrit : |
il est défini dans la partie 2 avec tata
Citation : en réalité c que prout ? (le 1. c le numéro de ligne? ...parce que sinon je vois pas où est parsé le 1) |
1 est le numero de ligne rajouté avec la balise cpp
Citation : parse() il renvoit quoi ? tt se fait dans cup ? |
chaipu, fovoir la doc de JCup.
JCup va te generer une classe de parse suivant le nom que t'y as donné
Citation : un bookmark est définit par : |
eurf pour le coup, vu la tronche de ce que tu as a parser, je sais pas si une grammaire soit effectivement la bonne solution
Marsh Posté le 16-09-2004 à 14:17:40
A vrai dire, aucune idée. Si tu le donnes a manger a un parser html/xml ca donne quoi ?
Marsh Posté le 16-09-2004 à 17:29:25
chrisbk a écrit : A vrai dire, aucune idée. Si tu le donnes a manger a un parser html/xml ca donne quoi ? |
Citation : Deux avions s'écrasent en Russie, la piste terroriste évoquée |
alors les tests ont été momentannément suspendus.
Marsh Posté le 16-09-2004 à 21:14:52
sinon y a javacc qui peut etre pas mal pour une premiere approche, et je trouve les tutos de javacc bien mieux que ceux du couple cup/jflex (meme si ma preference va a ce dernier)
Marsh Posté le 17-09-2004 à 12:16:32
oui g vu des tutos pour javacc (anciennement jack) ...j v surement m'y mettre, mais je sais pas si ca va me servir là sachant que en gros g 3 grands types de format de bookmarks :
- les dérivés HTML (netscape bookmark, bookmark de links, etc..) pour lesquels g le parseur swing (g trouvé un tuto qui va me permettre de l'utiliser tranquilement)
- les dérivés XML (XBEL, bookmarks d'épiphany (RDF)) pour lesquels je v utiliser DOM
- les autre, tous en format texte ...ils sont en général très primaire, et un parseur manuel ira largement
Marsh Posté le 17-09-2004 à 13:54:33
j'avais deja fait un truc pour parser les bookmarks type Netscape, ca se fait tres bien a la main aussi (moins joli, mais quand meme plus simple )
Marsh Posté le 17-09-2004 à 20:58:28
justement : g pas que des bookmarks netscape utilisant le html...il me faut donc qqc de plus générique (sinon oui, tu repère juste 3 motifs différents, et ca suffit pour parser : création d'un rep, création d'un bookmark, fermeture d'un rep...)
Marsh Posté le 15-09-2004 à 16:59:17
voilà : je voudrais faire 2 voire 3 parsers pour des petites grammaires assez simple, et on (nraynaud) m'a chaudement recommandé JLex/Cup. Effectivement ca conviendrait tout à fait, mais g vachement de mal à comprendre comment faire les fichiers de départ, et comment articuler le bouzin...
Je cherche un guide qui montrerait pas à pas comment partir de JLex/CUp, et comment utiliser le parseur créé...un exemple simple m'irait parfaitement....
si je trouve rien tant pis, vous aurez un parser en regexp de plus sur la conscience
---------------
Jubi Photos : Flickr - 500px