Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
654 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JLex/CUP] Je cherche un tuto pour débutant ultra débutant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JLex/CUP] Je cherche un tuto pour débutant ultra débutant

n°850867
Jubijub
Parce que je le VD bien
Posté le 15-09-2004 à 16:59:17  profilanswer
 

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 :D :p


---------------
Jubi Photos : Flickr - 500px
mood
Publicité
Posté le 15-09-2004 à 16:59:17  profilanswer
 

n°850966
chrisbk
-
Posté le 15-09-2004 à 19:18:25  profilanswer
 

heuh bah attends

n°850968
chrisbk
-
Posté le 15-09-2004 à 19:25:46  profilanswer
 

fichier jcup:
 
(en tres gros, je garanti meme pas que ca compile)
 


 
package monTruc;
 
//tes imports ici
 
 
parser code {:
:}
 
 
 
 
terminal SB_1, SB_2;
 
non terminal Integer cBidule
non terminal cStart;
 
 
start with cStart;
 
cStart::= cBidule:i  {: System.out.println(i); :}
;
 
i ::=  SB_1 {: RESULT = new Integer(12);}
;
 


 
 
Fichier jLex :
 


package monTruc;
import java_cup.runtime.Symbol;
 
%%
%cup
%%
 
"prout" { return new Symbol(sym.SB_1); }


 
 
utilisation :
 
 

parser toto = new parser(new Yylex(new FileReader("test.txt" )));
toto.parse();


Message édité par chrisbk le 15-09-2004 à 19:26:35
n°850971
chrisbk
-
Posté le 15-09-2004 à 19:29:42  profilanswer
 

apres, bon, c'est sur que c'est mieux si tu sais comment marche une grammaire [:joce]

n°850976
Jubijub
Parce que je le VD bien
Posté le 15-09-2004 à 19:37:33  profilanswer
 

lol...et un tuto qui explique ca plus clairement ? nraynaud a passé la nuit et une partie de l'après midi à m'expliquer ca...


---------------
Jubi Photos : Flickr - 500px
n°850984
chrisbk
-
Posté le 15-09-2004 à 19:57:10  profilanswer
 

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

n°850986
chrisbk
-
Posté le 15-09-2004 à 20:02:24  profilanswer
 

Sinon ben ptet ca : http://www.epaperpress.com/lexandyacc/
 
Spa jlex/jcup mais flex/yacc, mais bon, c'est limite assez kif kif

n°851373
Jubijub
Parce que je le VD bien
Posté le 16-09-2004 à 00:48:24  profilanswer
 

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


---------------
Jubi Photos : Flickr - 500px
n°851376
chrisbk
-
Posté le 16-09-2004 à 00:49:56  profilanswer
 

il est hautement couillon mon exemple :o  
mais faudrait te renseigner un brin sur les grammaires BNF et LALR1 si tu veux un fond de background

n°851381
Jubijub
Parce que je le VD bien
Posté le 16-09-2004 à 00:51:47  profilanswer
 

g regardé un cours...g failli vomir tellement ct moche à lire...
 
--> pour ton exemple : je sais pas ce qu'il fait...


---------------
Jubi Photos : Flickr - 500px
mood
Publicité
Posté le 16-09-2004 à 00:51:47  profilanswer
 

n°851393
chrisbk
-
Posté le 16-09-2004 à 01:03:54  profilanswer
 

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 :
  1. prout


 
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 :


cStart::= cBidule:i SB_2  {: System.out.println(i); :}
| SB_2                    {: System.out.println("Coucou" );}
;
 
cBidule ::=  SB_1         {: RESULT = new Integer(12);}
;  


 
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


Message édité par chrisbk le 16-09-2004 à 01:06:56
n°851395
chrisbk
-
Posté le 16-09-2004 à 01:07:12  profilanswer
 

(j'en raconte des trucs dites donc)

n°851415
Jubijub
Parce que je le VD bien
Posté le 16-09-2004 à 01:44:40  profilanswer
 

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 :
  1. 1. prout


 
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 :
  1. <!DOCTYPE NETSCAPE-Bookmark-file-1>
  2. <!-- This is an automatically generated file.
  3.      It will be read and overwritten.
  4.      DO NOT EDIT! -->
  5. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
  6. <TITLE>Bookmarks</TITLE>
  7. <H1 LAST_MODIFIED="1095188192">Bookmarks</H1>
  8. <DL><p>
  9.     <DT><H3 ADD_DATE="1093110929" LAST_MODIFIED="1095188542" PERSONAL_TOOLBAR_FOLDER="true" ID="rdf:#$Rc7PX1">bookttool</H3>
  10. <DD>toolbar descrptition
  11.     <DL><p>
  12.         <DT><A HREF="http://java.sun.com/products/jfc/tsc/articles/bookmarks/index.html" ADD_DATE="1095188519" LAST_MODIFIED="1095188577" SHORTCUTURL="parser" LAST_CHARSET="ISO-8859-1" ID="rdf:#$e6RGp3">The Swing HTML Parser</A>
  13. <DD>descrption parseur
  14.     </DL><p>
  15.     <DT><H3 ADD_DATE="1093110958" LAST_MODIFIED="1095188147" ID="rdf:#$ch7PX1">Linux</H3>
  16.     <DL><p>
  17.         <DT><H3 ADD_DATE="1093115661" LAST_MODIFIED="1093115666" ID="rdf:#$nh7PX1">Softs</H3>
  18.         <DL><p>
  19.             <DT><H3 ADD_DATE="1093110997" LAST_MODIFIED="1095188140" ID="rdf:#$oh7PX1">Images</H3>
  20.             <DL><p>
  21.                 <DT><A HREF="http://www.linux-france.org/article/sys/fhs/fhs-toc.html" ADD_DATE="1085236120" LAST_VISIT="1094135156" LAST_CHARSET="ISO-8859-1" ID="rdf:#$xh7PX1">Norme de hiérarchie du système de fichiers - Page de titre</A>
  22.             </DL><p>
  23.         </DL><p>
  24.         <DT><A HREF="http://www.pathname.com/fhs/" ADD_DATE="1085236116" LAST_CHARSET="ISO-8859-1" ID="rdf:#$wh7PX1">Filesystem Hierarchy Standard</A>
  25.         <DT><A HREF="http://www.aeabb.net/options2004.htm" ADD_DATE="1086026660" LAST_VISIT="1093116010" LAST_MODIFIED="1095188600" LAST_CHARSET="ISO-8859-1" ID="rdf:#$yh7PX1">AEABB - Les matières d'option 2004ééééééé</A>
  26.     </DL><p>
  27.     <DT><H3 ADD_DATE="1093115625" LAST_MODIFIED="1093117947" ID="rdf:#$Rg7PX1">Windows</H3>
  28.     <DL><p>
  29.         <DT><H3 ADD_DATE="1093115637" LAST_MODIFIED="1095188158" ID="rdf:#$Sg7PX1">Softs</H3>
  30.         <DL><p>
  31.             <DT><A HREF="http://athos.leffe.dnsalias.com/" ADD_DATE="1074456064" LAST_VISIT="1089658124" LAST_MODIFIED="1093115688" ICON="http://athos.leffe.dnsalias.com/favicon.ico" LAST_CHARSET="ISO-8859-1" ID="rdf:#$Ug7PX1">[EN] FFDshow beta - site du devel</A>
  32.         </DL><p>
  33.     </DL><p>
  34.     <DT><A HREF="http://forum.hardware.fr/sqlforum/forum.php3?config=hardwarefr.inc" ADD_DATE="1033326333" LAST_VISIT="1088853811" LAST_MODIFIED="1036614718" ICON="http://forum.hardware.fr/favicon.ico" LAST_CHARSET="ISO-8859-1" ID="rdf:#$Sc7PX1">Forum Hardware.fr</A>
  35.     <DT><A HREF="http://www.presence-pc.com/sqlforum/forum.php3?interface=&config=root42.inc" ADD_DATE="1039655929" LAST_VISIT="1049660750" LAST_MODIFIED="1039655934" ICON="file:///D:/homewin/MozillaFirebird/Jubijub/uiw4zvu6.slt/chrome/LinkCheckerResource/redirected.png" LAST_CHARSET="ISO-8859-1" ID="rdf:#$Tc7PX1">FORUM root42</A>
  36. </DL><p>


 
J'ai isolé les motifs, ce qui donne :  
un dossier est déterminé par : (j'utilise l'italique si c optionnel)

Code :
  1. <DT><H3 ADDDATE="[date]" LASTMODIFIED="[date]"> [nom_du_dossier] </H3>
  2. <DD> [description du dossier]
  3.     <DL><p>
  4.         [contenu du dossier : autre dossiers, bookmarks]
  5.     </DL><p>


 
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


Message édité par Jubijub le 16-09-2004 à 02:00:55

---------------
Jubi Photos : Flickr - 500px
n°851468
chrisbk
-
Posté le 16-09-2004 à 09:27:25  profilanswer
 

Jubijub a écrit :


si g bien suivi, SB2 sert à rien (il est pas défini dans ton fichier lex)


 
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 :  
 
[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


 
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

n°851695
Jubijub
Parce que je le VD bien
Posté le 16-09-2004 à 13:32:18  profilanswer
 

tu recommandes quoi ?


---------------
Jubi Photos : Flickr - 500px
n°851724
chrisbk
-
Posté le 16-09-2004 à 14:17:40  profilanswer
 

A vrai dire, aucune idée. Si tu le donnes a manger a un parser  html/xml ca donne quoi ?

n°851859
Jubijub
Parce que je le VD bien
Posté le 16-09-2004 à 16:29:07  profilanswer
 

j'ai essayé ...mais le parseur sun est horriblement mal documenté


---------------
Jubi Photos : Flickr - 500px
n°851936
d4rK 3Mpr0​R
fr33 Kevin
Posté le 16-09-2004 à 17:29:25  profilanswer
 

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
 
 
 
mercredi 25 août 2004 (Reuters - 09:09)
 
 
 
par Oleg Chtchedrov
 
MOSCOU - Deux avions de ligne russes transportant chacun une quarantaine de personnes se sont écrasés presque simultanément mardi soir dans le sud de la Russie.
 
Selon l'agence de presse Interfax, qui cite une source gouvernementale non identifiée, le premier appareil porté disparu avait lancé une alerte pour signaler qu'un détournement était en cours avant de disparaître des écrans de contrôle au-dessus de Rostov-sur-le-Don.
 
Le président Vladimir Poutine a confié l'enquête au FSB, indiquent par ailleurs les agences de presse russes. De source proche du gouvernement, on précise que le FSB, service fédéral de sécurité qui a succédé au KGB, enquête d'ordinaire sur les affaires aux circonstances douteuses.
 
Qui plus est, des témoins ont dit avoir vu une explosion peu avant que le deuxième avion ne s'écrase près de Toula, à 150 km au sud de Moscou, précise Interfax qui cite les autorités locales.


 
 
alors les tests ont été momentannément suspendus.

n°851937
chrisbk
-
Posté le 16-09-2004 à 17:30:00  profilanswer
 

[:le kneu]

n°851962
Jubijub
Parce que je le VD bien
Posté le 16-09-2004 à 17:44:25  profilanswer
 

j'ai trouvé un tuto pour le parseur sun :D ... :D


---------------
Jubi Photos : Flickr - 500px
n°852103
souk
Tourist
Posté le 16-09-2004 à 21:14:52  profilanswer
 

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)

n°852512
Jubijub
Parce que je le VD bien
Posté le 17-09-2004 à 12:16:32  profilanswer
 

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


---------------
Jubi Photos : Flickr - 500px
n°852603
souk
Tourist
Posté le 17-09-2004 à 13:54:33  profilanswer
 

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 :) )

n°852919
Jubijub
Parce que je le VD bien
Posté le 17-09-2004 à 20:58:28  profilanswer
 

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...)


---------------
Jubi Photos : Flickr - 500px
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JLex/CUP] Je cherche un tuto pour débutant ultra débutant

 

Sujets relatifs
Cherche un editeur graphique de table pour ORACLE SQL[Perl] Je cherche une alternative à crypt()
Cherche un bon script simple pr newsletterping auto d'une liste de PC (débutant)
[Débutant] Ptit coup de pouce pour démarrer!Cherche 2 unités de Gil Shapira UMEMORY et UGLOBAL
Débutant en programmation : Par quel(s) langage(s) commencerQuel livre pour s'initier à java pour un debutant en programmation
[Débutant Inside] Imprimer une base Access sous VB6petit probleme de debutant
Plus de sujets relatifs à : [JLex/CUP] Je cherche un tuto pour débutant ultra débutant


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR