summaryrefslogtreecommitdiff
path: root/src/spell-convert/lexer.lpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/spell-convert/lexer.lpp')
-rw-r--r--src/spell-convert/lexer.lpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/spell-convert/lexer.lpp b/src/spell-convert/lexer.lpp
new file mode 100644
index 0000000..92acf48
--- /dev/null
+++ b/src/spell-convert/lexer.lpp
@@ -0,0 +1,117 @@
+%{
+/* vim: set ft=lex: */
+//#include "lexer.hpp"
+
+#include "../strings/rstring.hpp"
+#include "../strings/zstring.hpp"
+
+#include "../io/cxxstdio.hpp"
+
+#include "../sexpr/lexer.hpp"
+
+#include "parser.hpp"
+
+#define yylval spell_converterlval
+
+RString *str(const char *s)
+{
+ return new RString(ZString(strings::really_construct_from_a_pointer, s, nullptr));
+}
+%}
+
+%option noyywrap
+%option prefix="spell_converter"
+%option nounput
+%option noinput
+
+%%
+
+"S" { yylval.s = str(yytext); return DIR; }
+"SW" { yylval.s = str(yytext); return DIR; }
+"W" { yylval.s = str(yytext); return DIR; }
+"NW" { yylval.s = str(yytext); return DIR; }
+"N" { yylval.s = str(yytext); return DIR; }
+"NE" { yylval.s = str(yytext); return DIR; }
+"E" { yylval.s = str(yytext); return DIR; }
+"SE" { yylval.s = str(yytext); return DIR; }
+"=" { return '='; }
+"==" { return EQ; }
+"<>" { return NEQ; }
+"!=" { return NEQ; }
+">" { return '>'; }
+"<" { return '<'; }
+">=" { return GTE; }
+"<=" { return LTE; }
+"(" { return '('; }
+")" { return ')'; }
+"+" { return '+'; }
+"-" { return '-'; }
+"*" { return '*'; }
+"/" { return '/'; }
+"%" { return '%'; }
+"&&" { return ANDAND; }
+"||" { return OROR; }
+";" { return ';'; }
+":" { return ':'; }
+"," { return ','; }
+"@" { return '@'; }
+"|" { return '|'; }
+"[" { return '['; }
+"]" { return ']'; }
+"&" { return '&'; }
+"^" { return '^'; }
+"." { return '.'; }
+"<<" { return SHL; }
+">>" { return SHR; }
+"PROCEDURE" { return PROCEDURE; }
+"CALL" { return CALL; }
+"OR" { return OR; }
+"TO" { return TO; }
+"TOWARDS" { return TOWARDS; }
+"TELEPORT-ANCHOR" { return TELEPORT_ANCHOR; }
+"SILENT" { return SILENT; }
+"LOCAL" { return LOCAL; }
+"NONMAGIC" { return NONMAGIC; }
+"SPELL" { return SPELL; }
+"LET" { return LET; }
+"IN" { return IN; }
+"END" { return END; }
+"=>" { return DARROW; }
+"STRING" { return STRING_TY; }
+"REQUIRE" { return REQUIRE; }
+"CATALYSTS" { return CATALYSTS; }
+"COMPONENTS" { return COMPONENTS; }
+"MANA" { return MANA; }
+"CASTTIME" { return CASTTIME; }
+"SKIP" { return SKIP; }
+"ABORT" { return ABORT; }
+"BREAK" { return BREAK; }
+"EFFECT" { return EFFECT_; }
+"ATEND" { return ATEND; }
+"ATTRIGGER" { return ATTRIGGER; }
+"CONST" { return CONST; }
+"PC" { return PC_F; }
+"NPC" { return NPC_F; }
+"MOB" { return MOB_F; }
+"ENTITY" { return ENTITY_F; }
+"TARGET" { return TARGET_F; }
+"IF" { return IF; }
+"THEN" { return THEN; }
+"ELSE" { return ELSE; }
+"FOREACH" { return FOREACH; }
+"FOR" { return FOR; }
+"DO" { return DO; }
+"WAIT" { return SLEEP; }
+
+\{([^\}]|\\.)*\} { yylval.s = str(yytext); return SCRIPT_DATA; }
+\"([^\"]|\\.)*\" { yylval.s = str(yytext); return STRING; }
+"-"?[0-9]+ { yylval.s = str(yytext); return INT; }
+"0x"[0-9a-fA-F]+ { yylval.s = str(yytext); return INT; }
+[a-zA-Z][-_a-zA-Z0-9]* { yylval.s = str(yytext); return ID; }
+"#".*$ { PRINTF("%s\n", sexpr::escape(*str(yytext + 1))); }
+"//".*$ { PRINTF("%s\n", sexpr::escape(*str(yytext + 2))); }
+[ \n\t\r] /* ignore whitespace */
+. { abort(); }
+
+%%
+// nothing to see here, move along