OSDN Git Service

upgrade to 3.6.1
[jnethack/source.git] / util / dgn_comp.l
1 %{
2 /* NetHack 3.6  dgn_comp.l      $NHDT-Date: 1455415007 2016/02/14 01:56:47 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.13 $ */
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
59 #else   /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
60 /* most recent flex allows suppressing yyunput() altogether when not needed */
61 #define YY_NO_UNPUT
62 #define YY_NO_INPUT
63 #endif
64
65 #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
66 /* older flex wants this */
67 #define YY_MALLOC_DECL  genericptr_t FDECL(malloc, (size_t)); \
68                         genericptr_t FDECL(realloc, (genericptr_t, size_t));
69 /* newer flex assumes <stdlib.h> so needs this in case it's been suppressed */
70 YY_MALLOC_DECL
71 #endif
72
73 void FDECL(init_yyin, (FILE *));
74 void FDECL(init_yyout, (FILE *));
75
76 /* this doesn't always get put in dgn_comp.h
77  * (esp. when using older versions of bison)
78  */
79 extern YYSTYPE yylval;
80
81 int nh_line_number = 1;
82
83 %}
84 %%
85 DUNGEON         return(A_DUNGEON);
86 up              { yylval.i=1; return(UP_OR_DOWN); }
87 down            { yylval.i=0; return(UP_OR_DOWN); }
88 ENTRY           return(ENTRY);
89 stair           return(STAIR);
90 no_up           return(NO_UP);
91 no_down         return(NO_DOWN);
92 portal          return(PORTAL);
93 PROTOFILE       return(PROTOFILE);
94 DESCRIPTION     return(DESCRIPTION);
95 LEVELDESC       return(LEVELDESC);
96 ALIGNMENT       return(ALIGNMENT);
97 LEVALIGN        return(LEVALIGN);
98 town            { yylval.i=TOWN ; return(DESCRIPTOR); }
99 hellish         { yylval.i=HELLISH ; return(DESCRIPTOR); }
100 mazelike        { yylval.i=MAZELIKE ; return(DESCRIPTOR); }
101 roguelike       { yylval.i=ROGUELIKE ; return(DESCRIPTOR); }
102 unaligned       { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); }
103 noalign         { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); }
104 lawful          { yylval.i=D_ALIGN_LAWFUL ; return(DESCRIPTOR); }
105 neutral         { yylval.i=D_ALIGN_NEUTRAL ; return(DESCRIPTOR); }
106 chaotic         { yylval.i=D_ALIGN_CHAOTIC ; return(DESCRIPTOR); }
107 BRANCH          return(BRANCH);
108 CHAINBRANCH     return(CHBRANCH);
109 LEVEL           return(LEVEL);
110 RNDLEVEL        return(RNDLEVEL);
111 CHAINLEVEL      return(CHLEVEL);
112 RNDCHLEVEL      return(RNDCHLEVEL);
113 [-0-9]+         { yylval.i=atoi(yytext); return(INTEGER); }
114 \"[^"]*\"       { yytext[yyleng - 1] = '\0'; /* discard the trailing \" */
115                   yylval.str = dupstr(yytext + 1); /* skip the first \" */
116                   return STRING; }
117 ^#.*\n          { nh_line_number++; }
118 \r?\n           { nh_line_number++; }
119 [ \t]+          ;       /* skip trailing tabs & spaces */
120 .               { return yytext[0]; }
121 %%
122
123 /* routine to switch to another input file; needed for flex */
124 void
125 init_yyin( input_f )
126 FILE *input_f;
127 {
128 #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
129     if (yyin)
130         yyrestart(input_f);
131     else
132 #endif
133         yyin = input_f;
134 }
135
136 /* analogous routine (for completeness) */
137 void
138 init_yyout( output_f )
139 FILE *output_f;
140 {
141     yyout = output_f;
142 }
143
144 /*dgn_comp.l*/