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

Caml Discussion :

[Ocamlyacc, Mehnir] Calculatrice


Sujet :

Caml

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 84
    Points
    84
    Par défaut [Ocamlyacc, Mehnir] Calculatrice
    Bonjour,

    J'essaye de réaliser une calculatrice avec gestion de variables. Pour cela j'utilise l'outil Menhir. Je l'utilise simplement pour mettre au point un AST que je traiterai plus tard.

    Voici les fichiers que j'utilise pour le parseur et le lexeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    %token <int> INT
    %token <string> SYMBOL
    %token PLUS MINUS TIMES DIVIDES
    %token LPAREN RPAREN
    %token LET BINDS IN
     
    %right IN
    %left PLUS MINUS
    %left TIMES DIVIDES
     
    %nonassoc UMINUS
     
    %token EOF
     
    %start <Types.expression> main
     
    %%
     
    main:
    | e = expression EOF
        { e }
     
    expression:
    | i = INT
        { Types.Number i }
    | s = SYMBOL
        { Types.Variable s }
    | LET s = SYMBOL BINDS i = INT IN e = expression
        { Types.Binding (s, i, e) }
    | LPAREN e = expression RPAREN
        { e }
    | e1 = expression PLUS e2 = expression
        { Types.Plus (e1, e2) }
    | e1 = expression MINUS e2 = expression
        { Types.Minus (e1, e2) }
    | e1 = expression TIMES e2 = expression
        { Types.Times (e1, e2) }
    | e1 = expression DIVIDES e2 = expression
        { Types.Divides (e1, e2) }
    | MINUS e = expression %prec UMINUS
        { Types.Uminus e }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    {
     
      open Parser
     
      exception Unknown_token
     
    }
     
    rule token = parse
      | [' ' '\n' '\t']
          { token lexbuf }
      | ['0'-'9']+ as i
          { INT (int_of_string i) }
      | ['a'-'z']+ as v
          { SYMBOL v }
      | '+'
          { PLUS }
      | '-'
          { MINUS }
      | '*'
          { TIMES }
      | '/'
          { DIVIDES }
      | '('
          { LPAREN }
      | ')'
          { RPAREN }
      | ":="
          { BINDS }
      | "let"
          { LET }
      | "in" 
          { IN }
      | eof
          { EOF }
      | _
          { raise Unknown_token }
    Là où j'ai un doute c'est la priorité que je donne au token IN car sans cette priorité j'ai un conflit shift reduce...

    Pour les expressions ne faisant pas intervenir de variables, cela fonctionne bien. En revanche dès qu'un let id := int in id j'obtiens une erreur de parsing.

    Voici le fichier des types que j'utilise pour l'AST :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type expression =
      | Number of int
      | Variable of string
      | Binding of string * int * expression
      | Uminus of expression
      | Plus of expression * expression
      | Minus of expression * expression
      | Times of expression * expression
      | Divides of expression * expression
    Si quelqu'un a une idée, je l'en remercie ;-)

    --
    sperca

  2. #2
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut
    Dans ton parser SYMBOL est mal placé.

    Quand dans ton exemple il analyse "let", au lieu de descendre jusqu'à LET, il s'arrête à SYMBOL ("let" est un symbole valide après tout).

    Donc quand tu lis "let truc = x", ça plante car il cherche une règle commençant par SYMBOL.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 84
    Points
    84
    Par défaut
    Merci à toi.

    Décidément je suis trop bête...

    Bref c'est bon tout est fonctionnel.

    Merci encore.

    --
    sperca

  4. #4
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut
    J'ai eu le même problème il y a 3 mois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide à la réalisation d'une calculatrice en C
    Par Premium dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 17/11/2005, 16h52
  2. [Calculatrice TI82] Réaliser un jeu
    Par Zenol dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 07/11/2005, 18h40
  3. calculatrice operations >a 1 chiffre
    Par xtaze dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 16/10/2005, 19h33
  4. [Comparaison] : Capacités des calculatrices/ordinateurs
    Par Évariste Galois dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 02/08/2005, 16h06
  5. [AWT] Demande Explications prog calculatrice
    Par smag dans le forum Débuter
    Réponses: 3
    Dernier message: 07/07/2005, 16h06

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