diff options
author | Ben Longbons <b.r.longbons@gmail.com> | 2014-03-16 14:55:57 -0700 |
---|---|---|
committer | Ben Longbons <b.r.longbons@gmail.com> | 2014-03-24 19:27:09 -0700 |
commit | fe3d4ce758822d65a0a5d617b7b77df2dbc972d8 (patch) | |
tree | d048a7e356ba542ebc5647b1aedfce4b8257daa2 /src/spell-convert/lexer.lpp | |
parent | c812c92d1a1835f0bda783e709481188c8d92225 (diff) | |
download | tmwa-fe3d4ce758822d65a0a5d617b7b77df2dbc972d8.tar.gz tmwa-fe3d4ce758822d65a0a5d617b7b77df2dbc972d8.tar.bz2 tmwa-fe3d4ce758822d65a0a5d617b7b77df2dbc972d8.tar.xz tmwa-fe3d4ce758822d65a0a5d617b7b77df2dbc972d8.zip |
Implement new magic frontend using sexpr
Diffstat (limited to 'src/spell-convert/lexer.lpp')
-rw-r--r-- | src/spell-convert/lexer.lpp | 117 |
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 |