blob: 69ad33ee2335c5deb66996e68f9e49649118e929 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
%{
// levcomp.l:
// Level compiler lexer for Dungeon Crawl Stone Soup.
//
// Based loosely on NetHack's lev_comp.l
#include "AppHdr.h"
#include "levcomp.tab.h"
#include <cstring>
static bool alloced = false;
static void clean()
{
if (yylval.text && alloced)
free( (void*) yylval.text);
yylval.text = NULL;
alloced = false;
}
static void settext()
{
clean();
if ((yylval.text = strdup(yytext)))
alloced = true;
}
%}
%s MAPDEF
%s ARGUMENT
%s MNAME
%s KEYWORDS
%option yylineno
%option never-interactive
NSPACE [^\ \t\r\n]
%%
<MAPDEF>^\s*ENDMAP { BEGIN(INITIAL); }
<MAPDEF>^#.*\r?\n ;
<MAPDEF>[a-zA-Z_&0-9|$+.@^#()\[\]=<>{}%*\-?]* {
settext();
return MAP_LINE;
}
^\s*MAP { BEGIN(MAPDEF); }
^\s*#.* ;
NAME: { BEGIN(ARGUMENT); return NAME; }
default-depth: return DEFAULT_DEPTH;
DEPTH: return DEPTH;
ORIENT: return ORIENT;
PLACE: { BEGIN(ARGUMENT); return PLACE; }
CHANCE: return CHANCE;
FLAGS: return FLAGS;
TAGS: { BEGIN(KEYWORDS); return TAGS; }
SYMBOL: { BEGIN(ARGUMENT); return SYMBOL; }
MONS: { BEGIN(MNAME); return MONS; }
BRANCHDEF: return BRANCH;
DEFAULT return DEFAULT;
DESC: return DESC;
BRANCH: return BRANCH;
ROOT_DEPTH: return ROOT_DEPTH;
FLOOR_COLOUR: return FLOOR_COLOUR;
ROCK_COLOUR: return ROCK_COLOUR;
LEVEL return LEVEL;
END return END;
PVAULT: return PVAULT;
PMINIVAULT: return PMINIVAULT;
ENTRY_MSG: { BEGIN(ARGUMENT); return ENTRY_MSG; }
EXIT_MSG: { BEGIN(ARGUMENT); return EXIT_MSG; }
MONSTERS return MONSTERS;
ENDMONSTERS return ENDMONSTERS;
<KEYWORDS>[A-Za-z_0-9\-]+ {
settext();
return STRING;
}
<KEYWORDS>[ \t]+ ;
<KEYWORDS>[ \t]*\r?\n { BEGIN(INITIAL); }
<MNAME>[^, \t\r\n][^,\r\n]+[^, \t\r\n] {
settext();
return MONSTER_NAME;
}
<MNAME>, return COMMA;
<MNAME>[ \t]*\r?\n { BEGIN(INITIAL); }
<MNAME>[ \t] ;
pandemonic return PANDEMONIC;
no_hmirror return NO_HMIRROR;
no_vmirror return NO_VMIRROR;
no_rotate return NO_ROTATE;
encompass return ENCOMPASS;
north return NORTH;
south return SOUTH;
east return EAST;
west return WEST;
northeast return NORTHEAST;
northwest return NORTHWEST;
southeast return SOUTHEAST;
southwest return SOUTHWEST;
- return DASH;
, return COMMA;
[0-9]+ {
clean();
yylval.i = atoi(yytext);
return INTEGER;
}
<ARGUMENT>{NSPACE}.*{NSPACE} {
BEGIN(INITIAL);
settext();
return STRING;
}
<ARGUMENT>\r?\n { BEGIN(INITIAL); }
[\ \t\r\n]+ ;
\( return OPAREN;
\) return CPAREN;
\" return QUOTE;
[a-zA-Z_][a-zA-Z_0-9]+ {
settext();
return IDENTIFIER;
}
. return CHARACTER;
%%
int yywrap()
{
clean();
return 1;
}
|