URL: https://linuxfr.org/forums/programmationautre/posts/ocaml-quel-strat%C3%A9gie-pour-transformer-un-arbre-en-grammaire Title: [OCaml] Quel stratégie pour transformer un arbre en grammaire ? Authors: Ontologia Date: 2009年08月22日T21:29:11+02:00 Tags: Score: 2 Bonjour, je réalise un utilitaire qui transforme du Java en Lisaac. Je dispose d'un source java sous forme XML (grâce à un petit programme nommé Java2Xml), que j'importe en Ocaml avec Xml-Light. Mon xml en caml est représenté avec le type : type xmls = Elem of (string * (string * string) list * xmls list);; (c'est celui de Xml Light, mais simplifié car je n'ai jamais de PCData avec l'xml que je traite) J'ai donc créé une grammaire java sous forme de type Ocaml afin de pouvoir transformer l'arbre XML en grammaire définie en Caml pour pouvoir réaliser quelques transformations. Voici un morceau de ma grammaire permettant de représenter une propriété (une variable) définie dans une classe : (* Champ (propriété) défini dans la classe *) type field = { name_f : string ; type_field : type_def ; transient_f : bool; volatile_f : string; static_f : £spaces£ £/spaces£bool; final_f : bool; visibility_f : visibility ; litteral_def_f : litteral_def ; lit_expre : expre } (* TODO : définir valeur littérale *) and (* DEFINITION D'UN TYPE *) type_def = { name_t : string; primitive_t : bool ; dimensions : int } and (* LITTERAUX : entiers, float, chaines, caractères *) litteral_def = LiteralChar of char | LiteralNombre of literal_number | LiteralChain of string | LiteralBool of bool | LiteralCaractere of char | LiteralNull and visibility = Public | Private | Protected Voici un exemple d'arbre xml que j'aimerai traiter : [field name="ANGLE_360" visibility="public" final="true" static="true"] [type primitive="true" name="int"/] [literal-number kind="integer" value="1920"/] [/field] [field name="VIEWPLANE_DISTANCE" visibility="public" final="true"] [type primitive="true" name="int"/] [paren] [binary-expr op="/"] [var-ref name="SCREEN_WIDTH"/] [literal-number kind="integer" value="64"/] [/binary-expr] [/paren] [/field] Evidemment, vous aurez compris, je veux faire une fonction qui me prend ce bout d'arbre en entré, et me renvoi un type field en sorti avec toutes les infos qui vont bien dedans. Après 10 ans sans avoir fait de caml (et de toutes façons jamais à ce niveau là), j'avoue que je me casse la tête sur le comment faire... En particulier, ce qui me bloque est de savoir comment je "ramasse" des informations qui peuvent se trouver sur 3 ou plus niveau de profondeur en une seule structure de données : mon type field est composé d'informations se trouvant dans la balise field, mais aussi dans son fils la balise type, ainsi que dans sa balise fille litteral. J'imagine que je dois donner mon type field aux fonctions qui vont traiter les élément fils de "field", mais j'ai du mal à trouver une manière concrète de l'écrire J'ai donc plusieurs idées : Stratégie 1 : je traite une première fois le xml afin de le simplifier. Par exemple mon exemple là haut pourrait devenir : [field name="ANGLE_360" visibility="public" final="true" static="true" type_primitive="true" type_name="int" literal_kind="integer" literal_value="1920" /] [field name="VIEWPLANE_DISTANCE" visibility="public" final="true" type_primitive="true" type_name="int"] [paren] [binary-expr op="/"] [var-ref name="SCREEN_WIDTH"/] [literal-number kind="integer" value="64"/] [/binary-expr] [/paren] [/field] ce qui ferait un xml qui colle mieux à ma structure et où les élement fils correspondraient uniquement à mes sous type dans mon enregistrement Stratégie 2 : Je ne touche pas à l'arbre Xml et quand je tombe sur un field, j'appel les fonction filtrant les balises type et litteral, auxquels je donne à manger mon type field que j'ai commencé à remplir avec les informations trouvée dans la balise field. Le problème, c'est que comme j'ai une _liste_ de fils, je suis tenté d'appliquer une fonction List.map à la liste qui me renverrait donc... une liste de type field que je devrait unir en un seul.. Mais j'ai du mal à le formaliser. Quel stratégie vous semble la meilleur ? Merci !

AltStyle によって変換されたページ (->オリジナル) /