summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/util/levcomp.lpp
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;
}