Bien, tout d'abiord merci pour ta réponse. Suite a ta demande, voici l'intégralité de mon fichier .l et .y, afin de t'eclairer un peu plus :)
Je tiens à préciser que c'est pour moi un exercice pédagogique, donc ce n'est certainement pas optimisé, ni très logique, c'est juste une tentative de "mon 1er langage" :)
creation:
|
VAR_CHAINE VARIABLE '=' CHAINE FIN
|
VAR_ENTIER VARIABLE '=' ENTIER FIN
|
VAR_REEL VARIABLE '=' REEL FIN
Voilà. Je ne vois pas trop comment m'en dépatouiller désormais...
En fait mon "langage" doit savoir faire 3 trucs :
1/ Avoir une fonction afficher("chaine"); qui affiche une chaine (ca marche à l'heure actuelle)
2/ Avoir une fonction saisie(variable); qui affiche un prompt puis stock la réponse dans variable
3/ Peut creer 3 types de variables, chaine, entier, reel, via a déclaration suivante : chaine ma_chaine = ""; (l'initialisation est obligatoire pour l'instant)
Le reste viendra plus tard..
Bref, à mon avis, j'ai mal découpé mon problème initial, donc les fondations etant mauvaises....
[^] # Re: Élémetns de réponse ;
Posté par cho7 (site web personnel) . En réponse au message La grammaire et Bison. Évalué à 1.
Je tiens à préciser que c'est pour moi un exercice pédagogique, donc ce n'est certainement pas optimisé, ni très logique, c'est juste une tentative de "mon 1er langage" :)
lex.l :
%{
#include <stdio.h>
#include "gram.tab.h"
%}
%%
afficher return FUNC_AFFICHER;
saisir return FUNC_SAISIR;
chaine return VAR_CHAINE;
entier return VAR_ENTIER;
reel return VAR_REEL;
[0-9]+ yylval.entier = atoi(yytext); return ENTIER;
[0-9]*\.[0-9] yylval.reel = atof(yytext); return REEL;
\".*\" yylval.chaine = strdup(yytext+1); yylval.chaine[strlen(yylval.chaine)-1] = '0円'; return CHAINE;
^#.*$ return COMMENTAIRE;
[a-zA-Z_][a-zA-Z_0-9] yylval.chaine = strdup(yytext); return VARIABLE;
; return FIN;
\( return PAR1;
\) return PAR2;
\n
\t
\
.
gram.y :
%{
#include <stdio.h>
#include <string.h>
void yyerror(const char *str)
{
fprintf(stderr,"erreur: %s\n",str);
}
int yywrap()
{
return 1;
}
main()
{
yyparse();
}
%}
%token FIN PAR1 PAR2 COMMENTAIRE FUNC_AFFICHER FUNC_SAISIR VAR_CHAINE VAR_ENTIER VAR_REEL EGAL
%union
{
long entier;
char *chaine;
double reel;
}
%token ENTIER
%token REEL
%token CHAINE
%token VARIABLE
%%
ligne:
|
ligne fonction FIN
|
ligne creation FIN
fonction:
|
FUNC_AFFICHER PAR1 CHAINE PAR2 FIN
{
printf("%s\n",3ドル);
}
;
|
FUNC_SAISIR PAR1 VARIABLE PAR2 FIN
{
char tab[255];
fgets(variable,255,stdin);
}
;
creation:
|
VAR_CHAINE VARIABLE '=' CHAINE FIN
|
VAR_ENTIER VARIABLE '=' ENTIER FIN
|
VAR_REEL VARIABLE '=' REEL FIN
Voilà. Je ne vois pas trop comment m'en dépatouiller désormais...
En fait mon "langage" doit savoir faire 3 trucs :
1/ Avoir une fonction afficher("chaine"); qui affiche une chaine (ca marche à l'heure actuelle)
2/ Avoir une fonction saisie(variable); qui affiche un prompt puis stock la réponse dans variable
3/ Peut creer 3 types de variables, chaine, entier, reel, via a déclaration suivante : chaine ma_chaine = ""; (l'initialisation est obligatoire pour l'instant)
Le reste viendra plus tard..
Bref, à mon avis, j'ai mal découpé mon problème initial, donc les fondations etant mauvaises....