*** empty log message ***
This commit is contained in:
264
util/lev_comp.l
Normal file
264
util/lev_comp.l
Normal file
@@ -0,0 +1,264 @@
|
||||
%{
|
||||
/* SCCS Id: @(#)lev_lex.c 3.3 2000/12/22 */
|
||||
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
#define LEV_LEX_C
|
||||
|
||||
#include "hack.h"
|
||||
#include "lev_comp.h"
|
||||
#include "sp_lev.h"
|
||||
|
||||
/* Most of these don't exist in flex, yywrap is macro and
|
||||
* yyunput is properly declared in flex.skel.
|
||||
*/
|
||||
#if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER)
|
||||
int FDECL(yyback, (int *,int));
|
||||
int NDECL(yylook);
|
||||
int NDECL(yyinput);
|
||||
int NDECL(yywrap);
|
||||
int NDECL(yylex);
|
||||
/* Traditional lexes let yyunput() and yyoutput() default to int;
|
||||
* newer ones may declare them as void since they don't return
|
||||
* values. For even more fun, the lex supplied as part of the
|
||||
* newer unbundled compiler for SunOS 4.x adds the void declarations
|
||||
* (under __STDC__ or _cplusplus ifdefs -- otherwise they remain
|
||||
* int) while the bundled lex and the one with the older unbundled
|
||||
* compiler do not. To detect this, we need help from outside --
|
||||
* sys/unix/Makefile.utl.
|
||||
*
|
||||
* Digital UNIX is difficult and still has int in spite of all
|
||||
* other signs.
|
||||
*/
|
||||
# if defined(NeXT) || defined(SVR4) || defined(_AIX32)
|
||||
# define VOIDYYPUT
|
||||
# endif
|
||||
# if !defined(VOIDYYPUT) && defined(POSIX_TYPES)
|
||||
# if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS)
|
||||
# define VOIDYYPUT
|
||||
# endif
|
||||
# endif
|
||||
# if !defined(VOIDYYPUT) && defined(WEIRD_LEX)
|
||||
# if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1)
|
||||
# define VOIDYYPUT
|
||||
# endif
|
||||
# endif
|
||||
# if defined(VOIDYYPUT) && defined(__osf__)
|
||||
# undef VOIDYYPUT
|
||||
# endif
|
||||
# ifdef VOIDYYPUT
|
||||
void FDECL(yyunput, (int));
|
||||
void FDECL(yyoutput, (int));
|
||||
# else
|
||||
int FDECL(yyunput, (int));
|
||||
int FDECL(yyoutput, (int));
|
||||
# endif
|
||||
#endif /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
|
||||
|
||||
#ifdef FLEX_SCANNER
|
||||
#define YY_MALLOC_DECL \
|
||||
genericptr_t FDECL(malloc, (size_t)); \
|
||||
genericptr_t FDECL(realloc, (genericptr_t,size_t));
|
||||
#endif
|
||||
|
||||
void FDECL(init_yyin, (FILE *));
|
||||
void FDECL(init_yyout, (FILE *));
|
||||
|
||||
/*
|
||||
* This doesn't always get put in lev_comp.h
|
||||
* (esp. when using older versions of bison).
|
||||
*/
|
||||
extern YYSTYPE yylval;
|
||||
|
||||
int line_number = 1, colon_line_number = 1;
|
||||
static char map[4096];
|
||||
static int map_cnt = 0;
|
||||
|
||||
/*
|
||||
* This is a hack required by Michael Hamel to get things
|
||||
* working on the Mac.
|
||||
*/
|
||||
#if defined(applec) && !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER)
|
||||
#undef input
|
||||
#undef unput
|
||||
#define unput(c) { yytchar = (c); if (yytchar == 10) yylineno--; *yysptr++ = yytchar; }
|
||||
# ifndef YYNEWLINE
|
||||
# define YYNEWLINE 10
|
||||
# endif
|
||||
|
||||
char
|
||||
input() /* Under MPW \n is chr(13)! Compensate for this. */
|
||||
{
|
||||
if (yysptr > yysbuf) return(*--yysptr);
|
||||
else {
|
||||
yytchar = getc(yyin);
|
||||
if (yytchar == '\n') {
|
||||
yylineno++;
|
||||
return(YYNEWLINE);
|
||||
}
|
||||
if (yytchar == EOF) return(0);
|
||||
else return(yytchar);
|
||||
}
|
||||
}
|
||||
#endif /* applec && !FLEX_SCANNER && !FLEXHACK_SCANNER */
|
||||
|
||||
%}
|
||||
%e 1500
|
||||
%p 5000
|
||||
%n 700
|
||||
%s MAPC
|
||||
%%
|
||||
<MAPC>ENDMAP {
|
||||
BEGIN(INITIAL);
|
||||
yylval.map = (char *) alloc(map_cnt + 1);
|
||||
(void) strncpy(yylval.map, map, map_cnt);
|
||||
yylval.map[map_cnt] = 0;
|
||||
map_cnt = 0;
|
||||
return MAP_ID;
|
||||
}
|
||||
<MAPC>[-|}{+ABCISHKPLWTF\\#. ]*\n {
|
||||
line_number++;
|
||||
(void) strncpy(map + map_cnt, yytext, yyleng);
|
||||
map_cnt += yyleng;
|
||||
map[map_cnt] = 0;
|
||||
}
|
||||
^#.*\n { line_number++; }
|
||||
: { colon_line_number = line_number; return ':'; }
|
||||
MESSAGE return MESSAGE_ID;
|
||||
MAZE return MAZE_ID;
|
||||
NOMAP return NOMAP_ID;
|
||||
LEVEL return LEVEL_ID;
|
||||
INIT_MAP return LEV_INIT_ID;
|
||||
FLAGS return FLAGS_ID;
|
||||
GEOMETRY return GEOMETRY_ID;
|
||||
^MAP\n { BEGIN(MAPC); line_number++; }
|
||||
OBJECT return OBJECT_ID;
|
||||
CONTAINER return COBJECT_ID;
|
||||
MONSTER return MONSTER_ID;
|
||||
TRAP return TRAP_ID;
|
||||
DOOR return DOOR_ID;
|
||||
DRAWBRIDGE return DRAWBRIDGE_ID;
|
||||
MAZEWALK return MAZEWALK_ID;
|
||||
WALLIFY return WALLIFY_ID;
|
||||
REGION return REGION_ID;
|
||||
RANDOM_OBJECTS return RANDOM_OBJECTS_ID;
|
||||
RANDOM_MONSTERS return RANDOM_MONSTERS_ID;
|
||||
RANDOM_PLACES return RANDOM_PLACES_ID;
|
||||
ALTAR return ALTAR_ID;
|
||||
LADDER return LADDER_ID;
|
||||
STAIR return STAIR_ID;
|
||||
PORTAL return PORTAL_ID;
|
||||
TELEPORT_REGION return TELEPRT_ID;
|
||||
BRANCH return BRANCH_ID;
|
||||
FOUNTAIN return FOUNTAIN_ID;
|
||||
SINK return SINK_ID;
|
||||
POOL return POOL_ID;
|
||||
NON_DIGGABLE return NON_DIGGABLE_ID;
|
||||
NON_PASSWALL return NON_PASSWALL_ID;
|
||||
ROOM return ROOM_ID;
|
||||
SUBROOM return SUBROOM_ID;
|
||||
RANDOM_CORRIDORS return RAND_CORRIDOR_ID;
|
||||
CORRIDOR return CORRIDOR_ID;
|
||||
GOLD return GOLD_ID;
|
||||
ENGRAVING return ENGRAVING_ID;
|
||||
NAME return NAME_ID;
|
||||
CHANCE return CHANCE_ID;
|
||||
levregion return LEV;
|
||||
open { yylval.i=D_ISOPEN; return DOOR_STATE; }
|
||||
closed { yylval.i=D_CLOSED; return DOOR_STATE; }
|
||||
locked { yylval.i=D_LOCKED; return DOOR_STATE; }
|
||||
nodoor { yylval.i=D_NODOOR; return DOOR_STATE; }
|
||||
broken { yylval.i=D_BROKEN; return DOOR_STATE; }
|
||||
north { yylval.i=W_NORTH; return DIRECTION; }
|
||||
east { yylval.i=W_EAST; return DIRECTION; }
|
||||
south { yylval.i=W_SOUTH; return DIRECTION; }
|
||||
west { yylval.i=W_WEST; return DIRECTION; }
|
||||
random { yylval.i = -1; return RANDOM_TYPE; }
|
||||
none { yylval.i = -2; return NONE; }
|
||||
object return O_REGISTER;
|
||||
monster return M_REGISTER;
|
||||
place return P_REGISTER;
|
||||
align return A_REGISTER;
|
||||
left { yylval.i=1; return LEFT_OR_RIGHT; }
|
||||
half-left { yylval.i=2; return LEFT_OR_RIGHT; }
|
||||
center { yylval.i=3; return CENTER; }
|
||||
half-right { yylval.i=4; return LEFT_OR_RIGHT; }
|
||||
right { yylval.i=5; return LEFT_OR_RIGHT; }
|
||||
top { yylval.i=1; return TOP_OR_BOT; }
|
||||
bottom { yylval.i=5; return TOP_OR_BOT; }
|
||||
lit { yylval.i=1; return LIGHT_STATE; }
|
||||
unlit { yylval.i=0; return LIGHT_STATE; }
|
||||
filled { yylval.i=0; return FILLING; }
|
||||
unfilled { yylval.i=1; return FILLING; }
|
||||
noalign { yylval.i= AM_NONE; return ALIGNMENT; }
|
||||
law { yylval.i= AM_LAWFUL; return ALIGNMENT; }
|
||||
neutral { yylval.i= AM_NEUTRAL; return ALIGNMENT; }
|
||||
chaos { yylval.i= AM_CHAOTIC; return ALIGNMENT; }
|
||||
coaligned { yylval.i= AM_SPLEV_CO; return ALIGNMENT; }
|
||||
noncoaligned { yylval.i= AM_SPLEV_NONCO; return ALIGNMENT; }
|
||||
peaceful { yylval.i=1; return MON_ATTITUDE; }
|
||||
hostile { yylval.i=0; return MON_ATTITUDE; }
|
||||
asleep { yylval.i=1; return MON_ALERTNESS; }
|
||||
awake { yylval.i=0; return MON_ALERTNESS; }
|
||||
m_feature { yylval.i= M_AP_FURNITURE; return MON_APPEARANCE; }
|
||||
m_monster { yylval.i= M_AP_MONSTER; return MON_APPEARANCE; }
|
||||
m_object { yylval.i= M_AP_OBJECT; return MON_APPEARANCE; }
|
||||
sanctum { yylval.i=2; return ALTAR_TYPE; }
|
||||
shrine { yylval.i=1; return ALTAR_TYPE; }
|
||||
altar { yylval.i=0; return ALTAR_TYPE; }
|
||||
up { yylval.i=1; return UP_OR_DOWN; }
|
||||
down { yylval.i=0; return UP_OR_DOWN; }
|
||||
false { yylval.i=0; return BOOLEAN; }
|
||||
true { yylval.i=1; return BOOLEAN; }
|
||||
dust { yylval.i=DUST; return ENGRAVING_TYPE; }
|
||||
engrave { yylval.i=ENGRAVE; return ENGRAVING_TYPE; }
|
||||
burn { yylval.i=BURN; return ENGRAVING_TYPE; }
|
||||
mark { yylval.i=MARK; return ENGRAVING_TYPE; }
|
||||
blessed { yylval.i=1; return CURSE_TYPE; }
|
||||
uncursed { yylval.i=2; return CURSE_TYPE; }
|
||||
cursed { yylval.i=3; return CURSE_TYPE; }
|
||||
contained { return CONTAINED; }
|
||||
noteleport { yylval.i=NOTELEPORT; return FLAG_TYPE; }
|
||||
hardfloor { yylval.i=HARDFLOOR; return FLAG_TYPE; }
|
||||
nommap { yylval.i=NOMMAP; return FLAG_TYPE; }
|
||||
arboreal { yylval.i=ARBOREAL; return FLAG_TYPE; } /* KMH */
|
||||
shortsighted { yylval.i=SHORTSIGHTED; return FLAG_TYPE; }
|
||||
\[\ *[0-9]+\%\ *\] { yylval.i = atoi(yytext + 1); return PERCENT; }
|
||||
[+\-]?[0-9]+ { yylval.i=atoi(yytext); return INTEGER; }
|
||||
\"[^"]*\" { yytext[yyleng-1] = 0; /* Discard the trailing \" */
|
||||
yylval.map = (char *) alloc(strlen(yytext+1)+1);
|
||||
Strcpy(yylval.map, yytext+1); /* Discard the first \" */
|
||||
return STRING; }
|
||||
\n { line_number++; }
|
||||
[ \t]+ ;
|
||||
'\\.' { yylval.i = yytext[2]; return CHAR; }
|
||||
'.' { yylval.i = yytext[1]; return CHAR; }
|
||||
. { return yytext[0]; }
|
||||
%%
|
||||
#ifdef AMIGA
|
||||
long *alloc(n)
|
||||
unsigned n;
|
||||
{
|
||||
return ((long *)malloc (n));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* routine to switch to another input file; needed for flex */
|
||||
void init_yyin( input_f )
|
||||
FILE *input_f;
|
||||
{
|
||||
#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
|
||||
if (yyin)
|
||||
yyrestart(input_f);
|
||||
else
|
||||
#endif
|
||||
yyin = input_f;
|
||||
}
|
||||
/* analogous routine (for completeness) */
|
||||
void init_yyout( output_f )
|
||||
FILE *output_f;
|
||||
{
|
||||
yyout = output_f;
|
||||
}
|
||||
|
||||
/*lev_comp.l*/
|
||||
Reference in New Issue
Block a user