Bonjour à tous,
J'essaie actuellement de recoder lex avec lex.
Le but est de prendre un fichier .lex en entrée :
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 :
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 :
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 :
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 :
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
Partager