TourDeJeu, le réseau des jeux en ligne alternatifs : jeux web, casual MMOs, jeux par forum ou par e-mail. En savoir +
En ligne : 724 jeux, 7086 news, 26392 commentaires
 

Recherche de jeu par critères - Un jeu au hasard !

Le guide des jeux en ligne alternatifs

Comment crer son jeu et le grer ?

Les Focus

Tech. : Le programmeur cologique
Tech. : automatisation et mails
Salon MondeDuJeu 2002
Revue de presse des JpC
Humour : 1001 raisons pour jouer
Ludique : le joueur parfait
Ludique : dcouverte du JpC
PHP : accs base de donnes
PHP : structure du site
Ludique : JpC et Temps rel
Jeux de rles sans rgles
Humour : astrologie du JpC
Tech. : Bases de donnes
MJ : les joueurs multiples
PHP : utilit pour un JpC
PHP : c'est quoi ?
Tech. : l'analyse des ordres
Ludique : dbutants et vtrans
Tech. : archi Ultraball 2100
Ludique : les jeux de pronos
Tech. : le site Web d'un JpC
Humour : football et wargame
Prsentation de TourDeJeu

Tech : Analyse syntaxique des ordres

par Touriste

Quiconque a crit la main un programme d'analyse des ordres envoys par les joueurs sait le calvaire que c'est. Il faut dcouper les lignes pour voir si le mot 'Construire' est bien suivi par le mot 'ferme' ou par le mot 'abri', si le premier mot de la ligne est 'Fabriquer' il doit tre suivi par un chiffre, lui-mme suivi par 'fromage' ou 'plaquette de beurre'. Et ainsi de suite pour les diffrents ordres possibles. L'horreur crire, je vous dis !

Un bon programmeur est un fainant

Pourquoi vouloir rinventer la roue ? Il existe des techniques (et donc des programmes) pour analyser facilement les ordres des joueurs.

La premire tape de l'analyse d'une ligne d'ordre est le dcoupage en mots (aussi nomms units lexicales, ou lexmes).

La seconde tape consiste vrifier que les mots se suivent dans le bon ordre.

Voil, c'est aussi simple que a. Maintenant que vous avez tout compris, vos claviers !

Quoi, comment, vous voulez en savoir plus, l'explication prcdente ne vous suffit pas. Bon d'accord, je vais expliquer plus en dtail.

Sparons le bon grain de l'ivraie

Voyons les ordres prsents plus haut (tirs du jeu le roi du fromage)

  Construire ferme
  Construire abri
  Fabriquer N fromage
  Fabriquer N plaquette de beurre

avec N qui reprsente un nombre entier positif.

Les ordres envoys par les joueurs doivent contenir seulement les 7 units lexicales (i.e. 7 mots) suivantes :

  Construire
  ferme
  abri
  Fabriquer
  N (un nombre)
  fromage
  plaquette de beurre

Les mots 'plaquette de beurre' constituent une seule unit lexicale car dans ce jeu, une 'plaquette' est toujours une 'plaquette de beurre'. Tout autre mot prsent dans les ordres est invalide, il s'agit d'une erreur.

Le dcoupage est donc simplifi puisque les ordres sont forms uniquement de ces 7 lexmes. Les programmes qui effectuent automatiquement ce dcoupage partir de la liste des units lexicales sont appels analyseur lexicaux. Le plus connu d'entre eux est sans doute le programme 'lex' et son successeur 'flex'. Vous trouverez ce dernier sur le site du projet GNU l'url suivante http://www.gnu.org/software/flex/flex.html

Ci dessous, la description pour flex des 7 units lexicales prsentes, utiliser comme suit :

  flex fromage1.l
  gcc -o fromage1 lex.yy.c -ll

le programme obtenu a pour nom 'fromage1'

- fichier fromage1.flex -


/* ne pas diferencier minuscule et majuscule */
%option case-insensitive

%%
"construire"		{printf ("CONSTRUIRE");}
"ferme"			{printf ("FERME");}
"abri"			{printf ("ABRI");}
"fabriquer"		{printf ("FABRIQUER");}
"fromage"		{printf ("FROMAGE");}
"plaquette de beurre"	{printf ("BEURRE");}
[0-9]+			{printf ("NOMBRE");}
[ \t\n]+	 /* ignorer les espaces */
. printf( "caractre invalide: %s\n", yytext );
%%

int main () {
  yyin = stdin;
  yylex ();
}

Du bon sens et de l'ordre

Maintenant que l'on sait dcouper les ordres en units lexicales, il faut vrifier leur agencement. Ainsi, la ligne 'Fabriquer ferme' n'est pas un ordre, bien que construite avec des units lexicales valides.

Ici encore, il existe des mthode qui font le travail pour vous partir de la liste des ordres possibles -- i.e. la liste des suites de lexemes valides (nomm grammaire). Les programmes mettant en oeuvres ces mthodes sont nomms analyseur syntaxique.

Pour notre exemple, nous donnons l'analyseur syntaxique la liste suivante :

  Ordre = <construire> <ferme>
       ou <construire> <abri>
       ou <fabriquer> <nombre> <fromage>
       ou <fabriquer> <nombre> <beurre>

Les mots crits entre '<' et '>' sont les lexmes.

Ces outils permettent de dcrire des "groupes" d'ordres, par exemple :

  Ordre = Construction
       ou Fabrication

  Construction = <construire> <ferme>
	      ou <construire> <abri>

  Fabrication = <fabriquer> <nombre> <fromage>
	     ou <fabriquer> <nombre> <beurre>

o l'on prcise qu'un ordre est soit une construction, soit une fabrication.

L'analyseur syntaxique le plus connu est probablement 'yacc' et son successeur 'bison' qui s'interfacent avec 'lex' et 'flex'. Vous trouverez aussi bison sur le site du projet GNU l'url suivante : http://www.gnu.org/software/bison/bison.html

Ci dessous, la description pour bison (et le fichier flex associ) de notre grammaire exemple. Les commande utiliser sont :

  bison -d fromage2.y
  flex fromage2.l
  gcc -o fromage2 fromage2.tab.c lex.yy.c -ll

le programme obtenu a pour nom 'fromage2'

- fichier fromage2.y -

/* la liste des lexemes */
%token CONSTRUIRE FERME ABRI FABRIQUER FROMAGE 
       BEURRE NOMBRE

/* le symbole '|' reprente le 'ou'
 * le ';' la fin d'une regle
 */
%%
/* une liste d'ordre est compose par un ordre 
 * suivi d'une liste d'ordre 
 */
liste_ordres : ordre liste_ordres
	     | /* rien */
	     ;

/* un ordre est soit une construction, 
 * soit une fabrication 
 */
ordre : construction
      | fabrication
      ;

/* on construit soit une ferme soit un abri */
construction : CONSTRUIRE FERME 	
   {printf ("construction d'une ferme\n");}
	     | CONSTRUIRE ABRI		
	{printf ("construction d'un abri\n");}
	     ;

/* on fait soit du fromage, soit du beurre */
fabrication : FABRIQUER NOMBRE FROMAGE	
   {printf ("fabrication de %d fromage\n", $2);}
	    | FABRIQUER NOMBRE BEURRE	
	{printf("fabrication de %d plaquette 
	              de beurre\n", $2);}
	    ;
%%

int main () {
  yyparse ();
}

int yyerror () {
  fprintf (stderr, "Erreur\n");
  exit (1);
}

- fichier fromage2.l -

%{
#include "fromage2.tab.h"
%}
/* ne pas diferencier minuscule et majuscule */
%option case-insensitive

%%
"construire"		return CONSTRUIRE;
"ferme"			return FERME;
"abri"			return ABRI;
"fabriquer"		return FABRIQUER;
"fromage"		return FROMAGE;
"plaquette de beurre"	return BEURRE;
[0-9]+	     { yylval = atoi (yytext);
			  return NOMBRE;
			}
[ \t\n]+	  /* ignorer les espaces */
. printf( "caractre invalide: %s\n", yytext );
%%

Les analyseurs lexicaux et syntaxiques sont fortement lis, c'est pourquoi deux taches sont parfois effectues par un seul programme, par exemple JavaCC ou bien ANTLR.

Vous l'aurez constat, les programmes Flex et Bison que j'ai utiliss pour illustrer mon propos gnrent du code C. Pour produire un programme en Java il vous faut utiliser JavaCC ou ANTLR. Il existe probablement d'autres programmes qui gnrent de l'ADA, du C++, ... je vous laisse les chercher.

Les techniques que je vous ai prsentes sont issues de la recherche sur les langages de programmation. Ces techniques sont bases sur des thories spcifiques ce type de langage. Si vous rencontrez des problmes pour analyser vos ordres l'aide de ces techniques, c'est probablement que la description de vos ordres (la grammaire) doit tre lgrement modifie. Pour plus d'information sur le sujet, vous pouvez consulter tout ouvrage traitant de "l'analyse syntaxique" ("parsing" en anglais). Il existe de nombreux cours disponibles en ligne (recherchez "cours analyse syntaxique" dans votre moteur de rechercher prfr), ainsi que des livres disponibles au tl-chargement ( exemple).

Prcdent - Suivant



Commentaires laissés par les visiteurs

  • melicine, le 21-10-2007
    Besoin d'aide
    Bonjour je suis melicine et je voudrais creer un jeu de simulation genre sim-plage. Mais le probleme c'est que je ne sais pas comment faire !!!Qui pourrais m'aider ? Contactez moi sur l'adresse mail suivante: the-one-createur@hotmail.fr Merci beaucoup d'avance
  • Hugodelire, le 20-02-2007
    Euhh ..........
    Comment trouver un site qui ns heberge ? Faut il payer ?