IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Langage de script


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 57
    Points : 41
    Points
    41
    Par défaut Langage de script
    hello,

    Je bosse actuellement sur un langage de script perso pour un jeu.
    j'ai un petit souci au niveau de mon lexer/parser :

    Emettons la syntaxe suivante :

    Int a = 3 ;

    Du type: INT SPACE STRING SPACE AFFECT SPACE NUMBER SPACE END

    C’est facile vu que chaque élément est séparé, on récupère chaque token séparé par des ‘ ‘, on détecte le type et utilise la grammaire associé.
    Là où il y a un souci c’est lorsque l’on a :

    Int a=3;

    Du type: INT SPACE STRING
    En fait c’est : INT SPACE STRING AFFECT NUMBER END

    Tout accroché, comment faire afin de récupérer la vraie grammaire, sachant que les SPACE sont facultatifs ?

  2. #2
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    J'avoue que je connais mal le sujet, mais l'idée que j'aurais c'est analyser chaque chaine de type "string" pour voir si elle ne contient pas un character spécial genre "=" ( AFFECTATION ) et a partir de la tu redivise ta chaine.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pourquoi ne pas utiliser un vrai analyseur lexical / syntaxique ? Ou au moins un moteur d'expressions régulières si tes scripts sont tous de cette forme ?

  4. #4
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    L'opérateur '=' est un token.

    Donc ta fonction qui renvoie le token suivant doit renvoyer "=".
    Pour çà il faut lire caractère par caractère le fichier ou le buffer.
    L'itération est humaine; la récursion, divine.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    le problème est que cette expression n'est qu'un exemple et que tu peut avoir plusieurs expression :

    SI a<>0 ALORS affichicher(a) ;

    cela marche pour le moment avec une ecriture de ce type :

    SI a <> 0 ALORS afficher ( a ) ;

    donc je doit faire caractere par caractere et comparer tous les tokens ce qui est assez lourd.
    en plus il y a des token de deux caracteres ou trois, imaginez '<' '>' '<>' la encore un souci ...

    LOULOU >>
    je craind de devoir me rabattre sur ton idée d'utiliser un parseur tout fait, mais je n'ai trouvé que lex et yacc, flex et bison et boost::spirit.

    les deux premier sont les memes, mais sont code::blocks j'arrive pas a les faire foncionner comme il faut.
    boost::spirit, sans éxemple je suis perdu et la doc sur le sujet est trop juste.

  6. #6
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut Re: Langage de script
    Citation Envoyé par black.out
    hello,

    Je bosse actuellement sur un langage de script perso pour un jeu.
    j'ai un petit souci au niveau de mon lexer/parser :

    Emettons la syntaxe suivante :

    Int a = 3 ;

    Du type: INT SPACE STRING SPACE AFFECT SPACE NUMBER SPACE END

    C’est facile vu que chaque élément est séparé, on récupère chaque token séparé par des ‘ ‘, on détecte le type et utilise la grammaire associé.
    Là où il y a un souci c’est lorsque l’on a :

    Int a=3;

    Du type: INT SPACE STRING
    En fait c’est : INT SPACE STRING AFFECT NUMBER END

    Tout accroché, comment faire afin de récupérer la vraie grammaire, sachant que les SPACE sont facultatifs ?
    Et si on ne tient plus compte des SPACES, et que le type n'est plus "int" mais "int<SPACE>", sa règlerais els problèmes non?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    en fait JC_Master, le probléme est dans l'analyse de la string qui suit.

    comment analyser les chaines :
    a<b;
    a<>b;
    afficher("coucou");
    ...

    carcatere par caractere ca marche pas,
    le seul moyen est de faire une recherche dans la string de la chaine la plus longue a la plus courte, mais la encore probleme, imaginons :

    afficher("coucou <> coucou");
    il va detecter le <> du coup bug ...

    non franchement je baisse le drapeau et vai me rabattre sur une librairie existante.

    j'hesite entre flex/bison et boost::spirit.

    le second me tenterai bien : metaprog, c++, bonne librairie il parait (boost).
    mais je ne trouve pas de doc "comprehensible" dessus.

  8. #8
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    C'est simple, tu donne une prioritée au parsage de "" par raport à <>
    C'est a dire que "" seras traiter avent <>, et donc tu n'a plas qu'a modifier la chaine en métent par exemple à la place l'index du tableau de ton aplic qui contien la chaine, ou encore le nom d'une variable...

    Mais dnas le cas ou tu veut développer le langage et non l'interpréteur, choisi une librérie.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  9. #9
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    j'utilise flex/bison (enfin plutot lex/yacc ^^) que je trouve très bien.

    Pour resoudre ton probleme il suffirais de bien definir ta grammaire au depart.
    si tu veux un exemple de ce genre je peux t'en passer un assez complet avec explications.

  10. #10
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    si ton code est écrit en C ou en C++, tu peux t'amuser à embarquer Lua qui est un langage embarquable et dont l'interpréteur ne fait que 600ko.

    Très facile à intégrer dans son projet et déjà opérationnel.

    Qu'en penses-tu ?
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

Discussions similaires

  1. Réponses: 8
    Dernier message: 23/11/2005, 15h04
  2. Réponses: 4
    Dernier message: 01/06/2005, 18h01
  3. Définition langage de scripting
    Par Filippo dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/12/2004, 10h25
  4. [langage] perl script pour balancer un B-arbre
    Par RonMaster dans le forum Langage
    Réponses: 5
    Dernier message: 22/10/2004, 18h35
  5. [langage] cherche script pour formater une chaine
    Par MASSAKA dans le forum Langage
    Réponses: 7
    Dernier message: 12/11/2003, 13h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo