summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/util/levcomp.lpp
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2006-11-22 08:41:20 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2006-11-22 08:41:20 +0000
commit1d0f57cbceb778139ca215cc4fcfd1584951f6dd (patch)
treecafd60c944c51fcce778aa5d6912bc548c518339 /crawl-ref/source/util/levcomp.lpp
parent6f5e187a9e5cd348296dba2fd89d2e206e775a01 (diff)
downloadcrawl-ref-1d0f57cbceb778139ca215cc4fcfd1584951f6dd.tar.gz
crawl-ref-1d0f57cbceb778139ca215cc4fcfd1584951f6dd.zip
Merged stone_soup r15:451 into trunk.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@452 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/util/levcomp.lpp')
-rw-r--r--crawl-ref/source/util/levcomp.lpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/crawl-ref/source/util/levcomp.lpp b/crawl-ref/source/util/levcomp.lpp
new file mode 100644
index 0000000000..69ad33ee23
--- /dev/null
+++ b/crawl-ref/source/util/levcomp.lpp
@@ -0,0 +1,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;
+}