2 /* NetHack 3.6 dgn_comp.l $NHDT-Date: 1449385184 2015/12/06 06:59:44 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.12 $ */
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. */
14 * Most of these don't exist in flex, yywrap is macro and
15 * yyunput is properly declared in flex.skel.
17 #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER)
18 int FDECL(yyback, (int *,int));
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.
32 * Digital UNIX is difficult and still has int in spite of all
35 # if defined(NeXT) || defined(SVR4) || defined(_AIX32)
38 # if !defined(VOIDYYPUT) && defined(POSIX_TYPES)
39 # if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS)
43 # if !defined(VOIDYYPUT) && defined(WEIRD_LEX)
44 # if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1)
48 # if defined(VOIDYYPUT) && defined(__osf__)
52 void FDECL(yyunput, (int));
53 void FDECL(yyoutput, (int));
55 int FDECL(yyunput, (int));
56 int FDECL(yyoutput, (int));
59 #else /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
60 /* most recent flex allows suppressing yyunput() altogether when not needed */
64 #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
65 /* older flex wants this */
66 #define YY_MALLOC_DECL genericptr_t FDECL(malloc, (size_t)); \
67 genericptr_t FDECL(realloc, (genericptr_t, size_t));
68 /* newer flex assumes <stdlib.h> so needs this in case it's been suppressed */
72 void FDECL(init_yyin, (FILE *));
73 void FDECL(init_yyout, (FILE *));
75 /* this doesn't always get put in dgn_comp.h
76 * (esp. when using older versions of bison)
78 extern YYSTYPE yylval;
80 int nh_line_number = 1;
84 DUNGEON return(A_DUNGEON);
85 up { yylval.i=1; return(UP_OR_DOWN); }
86 down { yylval.i=0; return(UP_OR_DOWN); }
90 no_down return(NO_DOWN);
91 portal return(PORTAL);
92 PROTOFILE return(PROTOFILE);
93 DESCRIPTION return(DESCRIPTION);
94 LEVELDESC return(LEVELDESC);
95 ALIGNMENT return(ALIGNMENT);
96 LEVALIGN return(LEVALIGN);
97 town { yylval.i=TOWN ; return(DESCRIPTOR); }
98 hellish { yylval.i=HELLISH ; return(DESCRIPTOR); }
99 mazelike { yylval.i=MAZELIKE ; return(DESCRIPTOR); }
100 roguelike { yylval.i=ROGUELIKE ; return(DESCRIPTOR); }
101 unaligned { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); }
102 noalign { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); }
103 lawful { yylval.i=D_ALIGN_LAWFUL ; return(DESCRIPTOR); }
104 neutral { yylval.i=D_ALIGN_NEUTRAL ; return(DESCRIPTOR); }
105 chaotic { yylval.i=D_ALIGN_CHAOTIC ; return(DESCRIPTOR); }
106 BRANCH return(BRANCH);
107 CHAINBRANCH return(CHBRANCH);
109 RNDLEVEL return(RNDLEVEL);
110 CHAINLEVEL return(CHLEVEL);
111 RNDCHLEVEL return(RNDCHLEVEL);
112 [-0-9]+ { yylval.i=atoi(yytext); return(INTEGER); }
113 \"[^"]*\" { yytext[yyleng - 1] = '\0'; /* discard the trailing \" */
114 yylval.str = dupstr(yytext + 1); /* skip the first \" */
116 ^#.*\n { nh_line_number++; }
117 \r?\n { nh_line_number++; }
118 [ \t]+ ; /* skip trailing tabs & spaces */
119 . { return yytext[0]; }
122 /* routine to switch to another input file; needed for flex */
127 #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
135 /* analogous routine (for completeness) */
137 init_yyout( output_f )