1 %{
2 /*	SCCS Id: @(#)dgn_lex.c	3.4	2002/03/27	*/
3 /*	Copyright (c) 1989 by Jean-Christophe Collet */
4 /*	Copyright (c) 1990 by M. Stephenson	     */
5 /* NetHack may be freely redistributed.  See license for details. */
6 
7 #define DGN_COMP
8 
9 #include "config.h"
10 #include "dgn_comp.h"
11 #include "dgn_file.h"
12 
13 /*
14  * Most of these don't exist in flex, yywrap is macro and
15  * yyunput is properly declared in flex.skel.
16  */
17 #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER)
18 int FDECL(yyback, (int *,int));
19 int NDECL(yylook);
20 int NDECL(yyinput);
21 int NDECL(yywrap);
22 int NDECL(yylex);
23 	/* Traditional lexes let yyunput() and yyoutput() default to int;
24 	 * newer ones may declare them as void since they don't return
25 	 * values.  For even more fun, the lex supplied as part of the
26 	 * newer unbundled compiler for SunOS 4.x adds the void declarations
27 	 * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain
28 	 * int) while the bundled lex and the one with the older unbundled
29 	 * compiler do not.  To detect this, we need help from outside --
30 	 * sys/unix/Makefile.utl.
31 	 *
32 	 * Digital UNIX is difficult and still has int in spite of all
33 	 * other signs.
34 	 */
35 # if defined(NeXT) || defined(SVR4) || defined(_AIX32)
36 #  define VOIDYYPUT
37 # endif
38 # if !defined(VOIDYYPUT) && defined(POSIX_TYPES)
39 #  if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS)
40 #   define VOIDYYPUT
41 #  endif
42 # endif
43 # if !defined(VOIDYYPUT) && defined(WEIRD_LEX)
44 #  if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1)
45 #   define VOIDYYPUT
46 #  endif
47 # endif
48 # if defined(VOIDYYPUT) && defined(__osf__)
49 #  undef VOIDYYPUT
50 # endif
51 # ifdef VOIDYYPUT
52 void FDECL(yyunput, (int));
53 void FDECL(yyoutput, (int));
54 # else
55 int FDECL(yyunput, (int));
56 int FDECL(yyoutput, (int));
57 # endif
58 #endif	/* !FLEX_SCANNER && !FLEXHACK_SCANNER */
59 
60 #ifdef FLEX_SCANNER
61 #define YY_MALLOC_DECL \
62 	       genericptr_t FDECL(malloc, (size_t)); \
63 	       genericptr_t FDECL(realloc, (genericptr_t,size_t));
64 #endif
65 
66 
67 void FDECL(init_yyin, (FILE *));
68 void FDECL(init_yyout, (FILE *));
69 
70 /* this doesn't always get put in dgn_comp.h
71  * (esp. when using older versions of bison)
72  */
73 
74 extern YYSTYPE yylval;
75 
76 int line_number = 1;
77 
78 %}
79 %%
80 DUNGEON		return(A_DUNGEON);
81 up		{ yylval.i=1; return(UP_OR_DOWN); }
82 down		{ yylval.i=0; return(UP_OR_DOWN); }
83 ENTRY		return(ENTRY);
84 stair		return(STAIR);
85 no_up		return(NO_UP);
86 no_down		return(NO_DOWN);
87 portal		return(PORTAL);
88 PROTOFILE	return(PROTOFILE);
89 DESCRIPTION	return(DESCRIPTION);
90 LEVELDESC	return(LEVELDESC);
91 ALIGNMENT       return(ALIGNMENT);
92 LEVALIGN        return(LEVALIGN);
93 town		{ yylval.i=TOWN ; return(DESCRIPTOR); }
94 hellish		{ yylval.i=HELLISH ; return(DESCRIPTOR); }
95 mazelike	{ yylval.i=MAZELIKE ; return(DESCRIPTOR); }
96 roguelike	{ yylval.i=ROGUELIKE ; return(DESCRIPTOR); }
97 unaligned       { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); }
98 noalign         { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); }
99 lawful          { yylval.i=D_ALIGN_LAWFUL ; return(DESCRIPTOR); }
100 neutral         { yylval.i=D_ALIGN_NEUTRAL ; return(DESCRIPTOR); }
101 chaotic         { yylval.i=D_ALIGN_CHAOTIC ; return(DESCRIPTOR); }
102 BRANCH		return(BRANCH);
103 CHAINBRANCH	return(CHBRANCH);
104 LEVEL		return(LEVEL);
105 RNDLEVEL	return(RNDLEVEL);
106 CHAINLEVEL	return(CHLEVEL);
107 RNDCHLEVEL	return(RNDCHLEVEL);
108 [-0-9]+		{ yylval.i=atoi(yytext); return(INTEGER); }
109 \"[^"]*\"	{ yytext[yyleng-1] = 0; /* Discard the trailing \" */
110 		  yylval.str = (char *) alloc(strlen(yytext+1)+1);
111 		  Strcpy(yylval.str, yytext+1); /* Discard the first \" */
112 		  return(STRING); }
113 ^#.*\n		{ line_number++; }
114 \r?\n		{ line_number++; }
115 [ \t]+		;	/* skip trailing tabs & spaces */
116 .		{ return yytext[0]; }
117 %%
118 
119 /* routine to switch to another input file; needed for flex */
120 void init_yyin( input_f )
121 FILE *input_f;
122 {
123 #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
124 	if (yyin)
125 	    yyrestart(input_f);
126 	else
127 #endif
128 	    yyin = input_f;
129 }
130 /* analogous routine (for completeness) */
131 void init_yyout( output_f )
132 FILE *output_f;
133 {
134 	yyout = output_f;
135 }
136 
137 /*dgn_comp.l*/
138