OSDN Git Service

adjust dungeon levels
[nethackexpress/trunk.git] / util / lev_comp.l
1 %{
2 /*      SCCS Id: @(#)lev_lex.c  3.4     2002/03/27      */
3 /*      Copyright (c) 1989 by Jean-Christophe Collet */
4 /* NetHack may be freely redistributed.  See license for details. */
5
6 #define LEV_LEX_C
7
8 #include "hack.h"
9 #include "lev_comp.h"
10 #include "sp_lev.h"
11
12 /* Most of these don't exist in flex, yywrap is macro and
13  * yyunput is properly declared in flex.skel.
14  */
15 #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER)
16 int FDECL(yyback, (int *,int));
17 int NDECL(yylook);
18 int NDECL(yyinput);
19 int NDECL(yywrap);
20 int NDECL(yylex);
21         /* Traditional lexes let yyunput() and yyoutput() default to int;
22          * newer ones may declare them as void since they don't return
23          * values.  For even more fun, the lex supplied as part of the
24          * newer unbundled compiler for SunOS 4.x adds the void declarations
25          * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain
26          * int) while the bundled lex and the one with the older unbundled
27          * compiler do not.  To detect this, we need help from outside --
28          * sys/unix/Makefile.utl.
29          *
30          * Digital UNIX is difficult and still has int in spite of all
31          * other signs.
32          */
33 # if defined(NeXT) || defined(SVR4) || defined(_AIX32)
34 #  define VOIDYYPUT
35 # endif
36 # if !defined(VOIDYYPUT) && defined(POSIX_TYPES)
37 #  if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS)
38 #   define VOIDYYPUT
39 #  endif
40 # endif
41 # if !defined(VOIDYYPUT) && defined(WEIRD_LEX)
42 #  if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1)
43 #   define VOIDYYPUT
44 #  endif
45 # endif
46 # if defined(VOIDYYPUT) && defined(__osf__)
47 #  undef VOIDYYPUT
48 # endif
49 # ifdef VOIDYYPUT
50 void FDECL(yyunput, (int));
51 void FDECL(yyoutput, (int));
52 # else
53 int FDECL(yyunput, (int));
54 int FDECL(yyoutput, (int));
55 # endif
56 #endif  /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
57
58 #ifdef FLEX_SCANNER
59 #define YY_MALLOC_DECL \
60               genericptr_t FDECL(malloc, (size_t)); \
61               genericptr_t FDECL(realloc, (genericptr_t,size_t));
62 #endif
63
64 void FDECL(init_yyin, (FILE *));
65 void FDECL(init_yyout, (FILE *));
66
67 /*
68  * This doesn't always get put in lev_comp.h
69  * (esp. when using older versions of bison).
70  */
71 extern YYSTYPE yylval;
72
73 int line_number = 1, colon_line_number = 1;
74 static char map[4096];
75 static int map_cnt = 0;
76
77 %}
78 %e 1500
79 %p 5000
80 %n 700
81 %s MAPC
82 %%
83 <MAPC>ENDMAP    {
84                   BEGIN(INITIAL);
85                   yylval.map = (char *) alloc(map_cnt + 1);
86                   (void) strncpy(yylval.map, map, map_cnt);
87                   yylval.map[map_cnt] = 0;
88                   map_cnt = 0;
89                   return MAP_ID;
90                 }
91 <MAPC>[-|}{+ABCISHKPLWTF\\#. 0123456789]*\r?\n  {
92                   int len = yyleng;
93                   /* convert \r\n to \n */
94                   if (len >= 2 && yytext[len - 2] == '\r') len -= 1;
95                   line_number++;
96                   (void) strncpy(map + map_cnt, yytext, len);
97                   map_cnt += len;
98                   map[map_cnt - 1] = '\n';
99                   map[map_cnt] = '\0';
100                 }
101 ^#.*\n          { line_number++; }
102 :               { colon_line_number = line_number; return ':'; }
103 MESSAGE         return MESSAGE_ID;
104 MAZE            return MAZE_ID;
105 NOMAP           return NOMAP_ID;
106 LEVEL           return LEVEL_ID;
107 INIT_MAP        return LEV_INIT_ID;
108 FLAGS           return FLAGS_ID;
109 GEOMETRY        return GEOMETRY_ID;
110 ^MAP\r?\n               { BEGIN(MAPC); line_number++; }
111 OBJECT          return OBJECT_ID;
112 CONTAINER       return COBJECT_ID;
113 MONSTER         return MONSTER_ID;
114 TRAP            return TRAP_ID;
115 DOOR            return DOOR_ID;
116 DRAWBRIDGE      return DRAWBRIDGE_ID;
117 MAZEWALK        return MAZEWALK_ID;
118 WALLIFY         return WALLIFY_ID;
119 REGION          return REGION_ID;
120 RANDOM_OBJECTS  return RANDOM_OBJECTS_ID;
121 RANDOM_MONSTERS return RANDOM_MONSTERS_ID;
122 RANDOM_PLACES   return RANDOM_PLACES_ID;
123 ALTAR           return ALTAR_ID;
124 LADDER          return LADDER_ID;
125 STAIR           return STAIR_ID;
126 PORTAL          return PORTAL_ID;
127 TELEPORT_REGION return TELEPRT_ID;
128 BRANCH          return BRANCH_ID;
129 FOUNTAIN        return FOUNTAIN_ID;
130 SINK            return SINK_ID;
131 POOL            return POOL_ID;
132 NON_DIGGABLE    return NON_DIGGABLE_ID;
133 NON_PASSWALL    return NON_PASSWALL_ID;
134 ROOM            return ROOM_ID;
135 SUBROOM         return SUBROOM_ID;
136 RANDOM_CORRIDORS        return RAND_CORRIDOR_ID;
137 CORRIDOR        return CORRIDOR_ID;
138 GOLD            return GOLD_ID;
139 ENGRAVING       return ENGRAVING_ID;
140 NAME            return NAME_ID;
141 CHANCE          return CHANCE_ID;
142 levregion       return LEV;
143 open            { yylval.i=D_ISOPEN; return DOOR_STATE; }
144 closed          { yylval.i=D_CLOSED; return DOOR_STATE; }
145 locked          { yylval.i=D_LOCKED; return DOOR_STATE; }
146 nodoor          { yylval.i=D_NODOOR; return DOOR_STATE; }
147 broken          { yylval.i=D_BROKEN; return DOOR_STATE; }
148 north           { yylval.i=W_NORTH; return DIRECTION; }
149 east            { yylval.i=W_EAST; return DIRECTION; }
150 south           { yylval.i=W_SOUTH; return DIRECTION; }
151 west            { yylval.i=W_WEST; return DIRECTION; }
152 random          { yylval.i = -1; return RANDOM_TYPE; }
153 none            { yylval.i = -2; return NONE; }
154 object          return O_REGISTER;
155 monster         return M_REGISTER;
156 place           return P_REGISTER;
157 align           return A_REGISTER;
158 left            { yylval.i=1; return LEFT_OR_RIGHT; }
159 half-left       { yylval.i=2; return LEFT_OR_RIGHT; }
160 center          { yylval.i=3; return CENTER; }
161 half-right      { yylval.i=4; return LEFT_OR_RIGHT; }
162 right           { yylval.i=5; return LEFT_OR_RIGHT; }
163 top             { yylval.i=1; return TOP_OR_BOT; }
164 bottom          { yylval.i=5; return TOP_OR_BOT; }
165 lit             { yylval.i=1; return LIGHT_STATE; }
166 unlit           { yylval.i=0; return LIGHT_STATE; }
167 filled          { yylval.i=0; return FILLING; }
168 unfilled        { yylval.i=1; return FILLING; }
169 noalign         { yylval.i= AM_NONE; return ALIGNMENT; }
170 law             { yylval.i= AM_LAWFUL; return ALIGNMENT; }
171 neutral         { yylval.i= AM_NEUTRAL; return ALIGNMENT; }
172 chaos           { yylval.i= AM_CHAOTIC; return ALIGNMENT; }
173 coaligned       { yylval.i= AM_SPLEV_CO; return ALIGNMENT; }
174 noncoaligned    { yylval.i= AM_SPLEV_NONCO; return ALIGNMENT; }
175 peaceful        { yylval.i=1; return MON_ATTITUDE; }
176 hostile         { yylval.i=0; return MON_ATTITUDE; }
177 asleep          { yylval.i=1; return MON_ALERTNESS; }
178 awake           { yylval.i=0; return MON_ALERTNESS; }
179 m_feature       { yylval.i= M_AP_FURNITURE; return MON_APPEARANCE; }
180 m_monster       { yylval.i= M_AP_MONSTER;   return MON_APPEARANCE; }
181 m_object        { yylval.i= M_AP_OBJECT;    return MON_APPEARANCE; }
182 sanctum         { yylval.i=2; return ALTAR_TYPE; }
183 shrine          { yylval.i=1; return ALTAR_TYPE; }
184 altar           { yylval.i=0; return ALTAR_TYPE; }
185 up              { yylval.i=1; return UP_OR_DOWN; }
186 down            { yylval.i=0; return UP_OR_DOWN; }
187 false           { yylval.i=0; return BOOLEAN; }
188 true            { yylval.i=1; return BOOLEAN; }
189 dust            { yylval.i=DUST; return ENGRAVING_TYPE; }
190 engrave         { yylval.i=ENGRAVE; return ENGRAVING_TYPE; }
191 burn            { yylval.i=BURN; return ENGRAVING_TYPE; }
192 mark            { yylval.i=MARK; return ENGRAVING_TYPE; }
193 blessed         { yylval.i=1; return CURSE_TYPE; }
194 uncursed        { yylval.i=2; return CURSE_TYPE; }
195 cursed          { yylval.i=3; return CURSE_TYPE; }
196 contained       { return CONTAINED; }
197 noteleport      { yylval.i=NOTELEPORT; return FLAG_TYPE; }
198 hardfloor       { yylval.i=HARDFLOOR; return FLAG_TYPE; }
199 nommap          { yylval.i=NOMMAP; return FLAG_TYPE; }
200 arboreal        { yylval.i=ARBOREAL; return FLAG_TYPE; }        /* KMH */
201 shortsighted    { yylval.i=SHORTSIGHTED; return FLAG_TYPE; }
202 \[\ *[0-9]+\%\ *\] { yylval.i = atoi(yytext + 1); return PERCENT; }
203 [+\-]?[0-9]+    { yylval.i=atoi(yytext); return INTEGER; }
204 \"[^"]*\"       { yytext[yyleng-1] = 0; /* Discard the trailing \" */
205                   yylval.map = (char *) alloc(strlen(yytext+1)+1);
206                   Strcpy(yylval.map, yytext+1); /* Discard the first \" */
207                   return STRING; }
208 \r?\n           { line_number++; }
209 [ \t]+          ;
210 '\\.'           { yylval.i = yytext[2]; return CHAR; }
211 '.'             { yylval.i = yytext[1]; return CHAR; }
212 .               { return yytext[0]; }
213 %%
214 #ifdef  AMIGA
215 long *alloc(n)
216         unsigned n;
217 {
218         return ((long *)malloc (n));
219 }
220 #endif
221
222 /* routine to switch to another input file; needed for flex */
223 void init_yyin( input_f )
224 FILE *input_f;
225 {
226 #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
227         if (yyin)
228             yyrestart(input_f);
229         else
230 #endif
231             yyin = input_f;
232 }
233 /* analogous routine (for completeness) */
234 void init_yyout( output_f )
235 FILE *output_f;
236 {
237         yyout = output_f;
238 }
239
240 /*lev_comp.l*/