summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2010-11-16 22:50:24 +0000
committerLudovic Pouzenc <ludovic@pouzenc.fr>2010-11-16 22:50:24 +0000
commit75d794c84242e812fa54f5c5578d10eb36d43c68 (patch)
tree16f51166ae83a6d1882118792be8182695f84e07 /src
parent3c21ae9631695fdc498eca2341f21abb30b27b35 (diff)
download2010-netlemmings-75d794c84242e812fa54f5c5578d10eb36d43c68.tar.gz
2010-netlemmings-75d794c84242e812fa54f5c5578d10eb36d43c68.tar.bz2
2010-netlemmings-75d794c84242e812fa54f5c5578d10eb36d43c68.zip
Proression sur un parser qui ne fait que parser et checker des assertions sur les plages de valeurs. Le chargement des fichiers gif et compagnie viendra après
git-svn-id: file:///var/svn/2010-netlemmings/trunk@151 077b3477-7977-48bd-8428-443f22f7bfda
Diffstat (limited to 'src')
-rw-r--r--src/parser/ginit.h24
-rw-r--r--src/parser/parse_ini.lex6
-rw-r--r--src/parser/parse_ini.yy132
-rw-r--r--src/test/test_parse.c2
4 files changed, 113 insertions, 51 deletions
diff --git a/src/parser/ginit.h b/src/parser/ginit.h
index 7cec1fe..a769851 100644
--- a/src/parser/ginit.h
+++ b/src/parser/ginit.h
@@ -3,17 +3,6 @@
#include "SDL/SDL.h"
- enum eMapStyle {
- brick , bubble , crystal , dirt , fire , marble ,
- pillar , rock , snow , special, undefined
- };
-
-/*
- char tabString_eMapStyle[][10] = {
- "brick" , "bubble" , "crystal" , "dirt" , "fire" , "marble" ,
- "pillar" , "rock" , "snow" , "special", "undefined"
- };
-*/
struct colorMap {
Uint32 bgColor;// background color present in "style".ini
Uint32 debrisColor;// debris color present in "style".ini
@@ -46,7 +35,7 @@
};
struct mapStyle {
- enum eMapStyle style; // map' style
+ char *style; // map' style
int superLemming; // off = 0; on = 1;
int tiles; // number of terrain_XX.gif present in "style".ini
int tilesObjet; //number of terraino_XX.gif
@@ -177,15 +166,20 @@
"numBuilders","numBashers","numMiners","numDiggers"
};
*/
+ struct skills {
+ int releaseRate,numLemmings,numToRescue,timeLimit;
+ int numClimbers,numFloaters,numBombers,numBlockers,numBuilders,numBashers,numMiners,numDiggers;
+ };
+
struct infoMap {
char* name; // map name; default=NULL;
- int paraMap[IDENT_COUNT]; // some parameter of this map
int xPos; // camera started position
- int MaxFallDistance; // max pixel lemming fall before died;default=0;
- int nuke; // hiroshima= 1; default =0;
+ int maxFallDistance; // max pixel lemming fall before died;default=0;
+// int nuke; // hiroshima= 1; default =0;
int nbrEntry; // number of entry in this map; default=0;
struct mapStyle map; // map
struct lemmingJobAndSprite *lemmingDATA; // DATA of lemmingJob; default=NULL;
+ struct skills initSkills;
};
// FIN: INFOMAP
diff --git a/src/parser/parse_ini.lex b/src/parser/parse_ini.lex
index e577123..7b67af9 100644
--- a/src/parser/parse_ini.lex
+++ b/src/parser/parse_ini.lex
@@ -107,9 +107,3 @@ COMMENT "#"[^\n]*
<VAL_OTHER>"," { return VIR; }
<VAL_STR>[^\r\n]+ { return string(STR); }
-
- /*<*>.+ { Everything else is catched here
- fprintf(stderr, "LEX : ERROR : unknown sequence '%s'", yytext);
- return LEXERROR;
- }
- */
diff --git a/src/parser/parse_ini.yy b/src/parser/parse_ini.yy
index bd1b5bc..6045024 100644
--- a/src/parser/parse_ini.yy
+++ b/src/parser/parse_ini.yy
@@ -1,6 +1,7 @@
%{
//#include <stdio.h>
#include <stdlib.h>
+#include <strings.h>
#include <stdint.h>
//#include <sys/types.h>
@@ -13,6 +14,7 @@ extern char *yytext;
int yylex();
void yyerror(struct gameInit *gInit, char *s);
+void yyassert(int condition, int what, int why);
%}
@@ -46,48 +48,118 @@ ini: /*epsilon*/
| decl ini
| EOL ini
-decl: STYLE AFF STR {}
-| NAME AFF STR { gInit->mapI.name = $3; }
-| SLEM AFF STR {}
-| TILES AFF INT {}
-| FRAMES INT AFF INT {}
-| ANIM INT AFF INT {}
-| TYPE INT AFF INT {}
-| SOUND INT AFF INT {}
-| BGCOLOR AFF INTHEX { gInit->mapI.map.cmap.bgColor = $3; }
-| DEBRISCOLOR AFF INTHEX { gInit->mapI.map.cmap.debrisColor = $3; }
-| PARTICLECOLOR AFF particles { gInit->mapI.map.cmap.particleColor = $3; }
-
-| XPOS AFF INT {}
+ /* styles/...ini */
+decl: BGCOLOR AFF INTHEX { gInit->style.bgColor = $3; }
+| DEBRISCOLOR AFF INTHEX { gInit->style.debrisColor = $3; }
+| PARTICLECOLOR AFF particles { gInit->style.particleColor = $3; }
+| TILES AFF INT {
+ yyassert($3>0,TILES, CANNOT_BE_NEGATIVE);
+ gInit->style.tiles = $3;
+ /* check coherence par rapport aux fichiers trouvés */
+ }
+| FRAMES INT AFF INT {
+ yyassert($2>0 && $2<MAX_OBJECT_TYPES, OBJECT_INDEX, OUT_OF_BOUNDS);
+ yyassert($4>0 && $4<MAX_OBJECT_FRAMES, FRAMES, OUT_OF_BOUNDS);
+ gInit->style.objects[$2].frames = $4;
+ }
+| ANIM INT AFF INT {
+ yyassert($2>0 && $2<MAX_OBJECT_TYPES, OBJECT_INDEX, OUT_OF_BOUNDS);
+ yyassert($4>0 && $4<=3, ANIM, BAD_VALUE);
+ gInit->style.objects[$2].anim = $4;
+ }
+| TYPE INT AFF INT {
+ yyassert($2>0 && $2<MAX_OBJECT_TYPES, OBJECT_INDEX, OUT_OF_BOUNDS);
+ yyassert($4==0|$4==32|($4>=3 && $4<=8), TYPE; BAD_VALUE);
+ gInit->style.objects[$2].type = $4;
+ }
+| SOUND INT AFF INT {
+ yyassert($2>0 && $2<MAX_OBJECT_TYPES, OBJECT_INDEX, OUT_OF_BOUNDS);
+ yyassert($4>=-1 && $4<=MAX_SOUNDS_COUNT, SOUND, OUT_OF_BOUNDS);
+ gInit->style.objects[$2].sound = $4;
+ }
+
+ /*lvl_xxxx.ini*/
+| RELEASERATE AFF INT {
+ yyasert($3>=0 && $3<=99, RELEASERATE, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.releaseRate = $3;
+ }
+| NUMLEMMINGS AFF INT {
+ yyasert($3>=0 && $3<=99, NUMLEMMINGS, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numLemmings = $3; }
+| NUMTORESCUE AFF INT {
+ yyasert($3>=0 && $3<=99, NUMTORESCUE, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numToRescue = $3;
+ }
+| TIMELIMIT AFF INT {
+ yyasert($3>=0 && $3<=99, TIMELIMIT, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.timeLimit = $3;
+ }
+| NUMCLIMBERS AFF INT {
+ yyasert($3>=0 && $3<=99, NUMCLIMBERS, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numClimbers = $3;
+ }
+| NUMFLOATERS AFF INT {
+ yyasert($3>=0 && $3<=99, NUMFLOATERS, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numFloaters = $3;
+ }
+| NUMBOMBERS AFF INT {
+ yyasert($3>=0 && $3<=99, NUMBOMBERS, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numBombers = $3;
+ }
+| NUMBLOCKERS AFF INT {
+ yyasert($3>=0 && $3<=99, NUMBLOCKERS, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numBlockers = $3;
+ }
+| NUMBUILDERS AFF INT {
+ yyasert($3>=0 && $3<=99, NUMBUILDERS, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numBuilders = $3;
+ }
+| NUMBASHERS AFF INT {
+ yyasert($3>=0 && $3<=99, NUMBASHERS, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numBashers = $3;
+ }
+| NUMMINERS AFF INT {
+ yyasert($3>=0 && $3<=99, NUMMINERS, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numMiners = $3;
+ }
+| NUMDIGGERS AFF INT {
+ yyasert($3>=0 && $3<=99, NUMDIGGERS, OUT_OF_BOUNDS);
+ gInit->mapI.initSkills.numDiggers = $3;
+ }
+| XPOS AFF INT {
+ yyasert($3>=0 && $3<=LEVEL_WITDH, XPOS, OUT_OF_BOUNDS);
+ gInit->mapI.xPos = $3;
+ }
+| STYLE AFF STR { gInit->mapI.map.style = $3; }
+| SLEM AFF STR { gInit->mapI.map.superLemming = strcasecmp("true", $3)==0; }
| OBJECT INT AFF INT VIR INT VIR INT VIR INT VIR INT {}
| TERRAIN INT AFF INT VIR INT VIR INT VIR INT {}
| STEEL INT AFF INT VIR INT VIR INT VIR INT {}
-| RELEASERATE AFF INT {}
-| NUMLEMMINGS AFF INT {}
-| NUMTORESCUE AFF INT {}
-| TIMELIMIT AFF INT {}
-| NUMCLIMBERS AFF INT {}
-| NUMFLOATERS AFF INT {}
-| NUMBOMBERS AFF INT {}
-| NUMBLOCKERS AFF INT {}
-| NUMBUILDERS AFF INT {}
-| NUMBASHERS AFF INT {}
-| NUMMINERS AFF INT {}
-| NUMDIGGERS AFF INT {}
-| MAXFALLDISTANCE AFF INT {}
+| NAME AFF STR { gInit->mapI.name = $3; } /* TODO : attention, si fichier levelpack, name n'est pas le nom d'unniveau */
+ /* levelpack.ini */
+| MAXFALLDISTANCE AFF INT {
+ gInit->mapI.maxFallDistance = $3;
+ }
| CODESEED AFF STR {}
-| MUSIC INT AFF STR {}
-| LEVEL INT AFF STR {}
-| DIFFICULTY INT AFF STR VIR INT {}
+| MUSIC INT AFF STR {}
+| LEVEL INT AFF STR {}
+| IDENT INT AFF STR VIR INT {}
particles: INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX {
$$=malloc(16*sizeof(uint32_t));
$$[0]=$1; $$[1]=$3; $$[2]=$5; $$[3]=$7; $$[4]=$9; $$[5]=$11; $$[6]=$13; $$[7]=$15 ;$$[8]=$17; $$[9]=$19; $$[10]=$21; $$[11]=$23; $$[12]=$25; $$[13]=$27; $$[14]=$29; $$[15]=$31;
}
%%
+void yyassert(int condition, int what, int why) {
+ char msg[256];
+ if (!condition) {
+ sprintf(msg, "%s for %s", errors[why], items[what]);
+ yyerror(NULL, msg);
+ }
+}
void yyerror(struct gameInit *gInit, char *s) {
fprintf(stderr, "(stdin):%i: error: %s near '%s'\n", yylineno, s, yytext);
- gInit->parseError=1;
+ gInit=NULL; /* Faire quelque chose de propre ici */
exit(1);
}
diff --git a/src/test/test_parse.c b/src/test/test_parse.c
index 4b65eb8..50ee80d 100644
--- a/src/test/test_parse.c
+++ b/src/test/test_parse.c
@@ -1,4 +1,5 @@
#include <stdio.h>
+#include <string.h>
#include "SDL/SDL.h"
#include "../parser/y.tab.h"
#include "../parser/ginit.h"
@@ -25,6 +26,7 @@ int main(int argc, char **argv) {
return 2;
}
}
+ memset(&gInit,0,sizeof(gInit));
printf("Parsing '%s'\n", filepath);
yyparse(&gInit);
// printf("End of parse ('%s')\n", filepath);