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 :

Yacc Parser.mly : parse_error


Sujet :

Caml

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Yacc Parser.mly : parse_error
    Bonjour à tous,

    J'essaie actuellement de recoder lex avec lex.

    Le but est de prendre un fichier .lex en entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %{ header %}
    expression_reguliere
    Et de reconnaitre l'expression reguliere afin d'en construire l'arbre de syntaxe abstraite.

    Voici mon problème :

    Je dispose d'un fichier lexer.mll qui reconnait les caractères et produit des token.

    Je dispose d'un fichier parser.mly dans lequel j'applique des actions en fonction des token.

    J'ai defini une expression reguliere comme étant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type expr_ast = |Char of char | Or of expr_ast*expr_ast ...
    Prenons par exemple un fichier .lex avec juste l'expression reguliere composé du caractere : a

    Dans mon fichier lexer.mll, j'ai une ligne qui parse le caractere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rule main = parse 
    ['a'-'z'] as lxm { CHAR(lxm)}
    Dans mon fichier parser.mly, si je fais

    Il n'y a pas de soucis, il reconnait bien le CHAR

    Par contre si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fichier:
    HEADER expr_ast
    Il me met parse_error : il ne reconnait pas CHAR comme une expr_ast

    Ai-je été clair ?
    Si oui avez vous une idée ?

    Voici le code de mon parser.mly en annexe :

    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
    %{
    open Syntax
     
    %}
     
     
    %token <string> HEADER
    %token <string> TRAILER
    %token <string> ACTION
    %token <char> CHAR
    %token Tequal Tor Tand Tlbracket Trbracket Tstar Tmaybe Tplus Tlparen Trparen Tcaret Tdash Tsharp Tend Teof
     
    %left Tor
    %nonassoc CONCATE
    %start fichier
    %type <Syntax.fichier> fichier
    %type <Syntax.expr_ast> expr_ast
    %%
     
    fichier:
    HEADER CHAR      Ah ce niveau la que ce ne marche pas si je remplace CHAR par expr_ast
     
    ;
    expr_ast:
    	 | CHAR {Char($1)}
    	 | expr_ast Tstar {Kleene($1)}
    	 | expr_ast Tplus {Repeat($1)}
    	 | expr_ast Tmaybe {Optionnal($1)}
    	 | expr_ast Tor expr_ast {Or($1,$3)}
    	 | expr_ast expr_ast %prec CONCATE {Concat($1,$2)}
    	 | Tlparen expr_ast Trparen {Parenthese($2)}
    	 | Tlbracket expr_ast Trbracket {Ensemble($2)}
    	| expr_ast Tdash expr_ast {Intervalle($1,$3)}
    	| Tcaret expr_ast {Not($2)}
    ;
    %%
    Merci beaucoup

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Non, ce n'est pas clair. D'après ton message, si tu écris "HEADER expr_ast", il renvoie un message d'erreur disant que CHAR n'est pas un expr_ast? Mais d'où sort le "CHAR" du message d'erreur si tu ne lui en parles pas dans le code source fautif ?

    Pourquoi ta règle fichier n'a-t-elle pas de production (on s'attend à "HEADER CHAR {Fichier($1)}" par exemple, plutôt que "HEADER CHAR") ?

    Tu devrais poster un exemple de code, potentiellement simplifié (en retirant les parties inutiles) mais auto-contenu, qui contient tout ce dont nous avons besoin pour tester le code nous-même et constater ton erreur. Par exemple on ne connaît pas le type Syntax.fichier et c'est gênant. Il vaut mieux mettre un peu trop de code, que ne pas mettre la partie qui pose problème ou qui permet de comprendre le problème.

Discussions similaires

  1. Parser Lex & Yacc, parser un argument precis
    Par blazed dans le forum Générateurs de compilateur
    Réponses: 5
    Dernier message: 11/09/2009, 16h07
  2. [JAXP] com.sun.xml.parser.ValidatingParser
    Par yolepro dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 05/11/2008, 16h36
  3. unterminated action (parser.mly)
    Par diabli73 dans le forum Caml
    Réponses: 8
    Dernier message: 10/05/2007, 06h14
  4. visual studio 2005 (c++) et parser generator (lex / yacc)
    Par must19 dans le forum Visual C++
    Réponses: 3
    Dernier message: 26/03/2007, 11h31
  5. [langage] Continuer a parser une ligne
    Par D[r]eadLock dans le forum Langage
    Réponses: 5
    Dernier message: 30/09/2002, 19h49

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