En fait le problème qu'il y a à gérer le séparateur dans la grammaire, c'est que ça l'alourdit. De plus il faut distinguer la notion de séparateur et de terminateur. Et puis il faut accepter de façon transparente les lignes vides en début de script...
Pour les cas simples, la technique que tu décris fonctionne mais j'ai des difficultés lorsque je veux prendre en compte les répétitions de non-terminaux.
Bon, en enlevant le superflu, ça donne ceci :
script
: separator resize_list
| separator when_list
| separator resize_list '\n' when_list
;
when_list
: when_expr
| when_list '\n' when_expr
;
when_expr
: WHEN cond_list '\n' resize_list
;
cond_list
: cond_expr
| cond_list AND cond_expr
;
resize_list
: resize_expr
| resize_list '\n' resize_expr
;
Il refuse d'interpréter plus d'une fois une when_list. Grrr.
Quant à l'analyseur lexical, j'ai trouvé une méthode pour forcer la reconnaissance d'un lexème en début de ligne (avec ou sans espaces) en utilisant une start condition.
Mais il me pourrit la vie avec les commentaires qui ne sont pas reconnus comme fin de ligne, malgré ça :
%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
%}
%s tol
%%
^[ \t]+ BEGIN(tol);
"resize" { BEGIN(0); return RESIZE; }
"when" { BEGIN(0); return WHEN; }
[^] # Re: Séparateur ?
Posté par VoixOff . En réponse au message YACC: retour-chariot comme séparateur. Évalué à 2.
Pour les cas simples, la technique que tu décris fonctionne mais j'ai des difficultés lorsque je veux prendre en compte les répétitions de non-terminaux.
Bon, en enlevant le superflu, ça donne ceci :
script
: separator resize_list
| separator when_list
| separator resize_list '\n' when_list
;
when_list
: when_expr
| when_list '\n' when_expr
;
when_expr
: WHEN cond_list '\n' resize_list
;
cond_list
: cond_expr
| cond_list AND cond_expr
;
resize_list
: resize_expr
| resize_list '\n' resize_expr
;
Il refuse d'interpréter plus d'une fois une when_list. Grrr.
Quant à l'analyseur lexical, j'ai trouvé une méthode pour forcer la reconnaissance d'un lexème en début de ligne (avec ou sans espaces) en utilisant une start condition.
Mais il me pourrit la vie avec les commentaires qui ne sont pas reconnus comme fin de ligne, malgré ça :
%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
%}
%s tol
%%
^[ \t]+ BEGIN(tol);
"resize" { BEGIN(0); return RESIZE; }
"when" { BEGIN(0); return WHEN; }
^"resize" return RESIZE;
^"when" return WHEN;
"and" return AND;
"to" return TO;
[,()=] return *yytext;
[0-9]+ { yylval.number = atoi(yytext); return NUMBER; }
[a-z]+ { yylval.type = strdup(yytext); return TYPE; }
\"[^\"]*["\n] { yylval.string = strdup(yytext); return STRING; }
'[^']*['\n] { yylval.string = strdup(yytext); return STRING; }
"//".* ; /* comments */
[ \t]+ ; /* spaces */
[\n]+ return '\n';
. fprintf(stderr, "invalid character: '%c'\n", *yytext);
%%
To be continued.
Merci pour tes remarques.