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

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

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


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 15-09-2004 à 16:59:17   

Reply

Marsh Posté le 15-09-2004 à 19:18:25    

heuh bah attends

Reply

Marsh Posté le 15-09-2004 à 19:25:46    

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
Reply

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

Reply

Marsh Posté le 15-09-2004 à 19:37:33    

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
Reply

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

Reply

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

Reply

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


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 16-09-2004 à 00:49:56    

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

Reply

Marsh Posté le 16-09-2004 à 00:51:47    

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
Reply

Marsh Posté le 16-09-2004 à 00:51:47   

Reply

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

Marsh Posté le 16-09-2004 à 01:07:12    

(j'en raconte des trucs dites donc)

Reply

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

Marsh Posté le 16-09-2004 à 09:27:25    

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

Reply

Marsh Posté le 16-09-2004 à 13:32:18    

tu recommandes quoi ?


---------------
Jubi Photos : Flickr - 500px
Reply

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 ?

Reply

Marsh Posté le 16-09-2004 à 16:29:07    

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


---------------
Jubi Photos : Flickr - 500px
Reply

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

Reply

Marsh Posté le 16-09-2004 à 17:30:00    

[:le kneu]

Reply

Marsh Posté le 16-09-2004 à 17:44:25    

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


---------------
Jubi Photos : Flickr - 500px
Reply

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)

Reply

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


---------------
Jubi Photos : Flickr - 500px
Reply

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

Reply

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


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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