summaryrefslogblamecommitdiff
path: root/src/map/magic-interpreter-lexer.lpp
blob: 2b68acfa5355d837f3bc79e5544c3bb660f3c630 (plain) (tree)
1
2
3
4
5
6
7
8
9
  

                                      
                                       
 
                             
 
              
                                                                    





                                                                         

                                               










                                    



























































                                                         
                                                 














                                                   
 
                         
                                                      




                         


                                                       
                               
     






                            
     


















                                                         
                                                      







                                                                                                                           

  
%{
#include "magic-interpreter-lexer.hpp"
#
#include "magic-interpreter-parser.hpp"

#include "../io/cxxstdio.hpp"

#ifdef HEADING
# error "what platform is this? please tell me who #defined HEADING"
#endif

#define FIXLOC magic_frontend_lloc.first_line = magic_frontend_lineno

#define HEADING(dir) { magic_frontend_lval.i = dir; FIXLOC; return DIR; }

// silence compiler warnings
#define YY_USER_INIT (void)yylval, (void)yylloc
%}

%option yylineno
%option noyywrap
%option prefix="magic_frontend_"
%option nounput
%option noinput
%option bison-bridge bison-locations

%%

"S"                     HEADING(0);
"SW"                    HEADING(1);
"W"                     HEADING(2);
"NW"                    HEADING(3);
"N"                     HEADING(4);
"NE"                    HEADING(5);
"E"                     HEADING(6);
"SE"                    HEADING(7);
"="                     {FIXLOC; return '=';}
"=="                    {FIXLOC; return EQ;}
"<>"                    {FIXLOC; return NEQ;}
"!="                    {FIXLOC; return NEQ;}
">"                     {FIXLOC; return '>';}
"<"                     {FIXLOC; return '<';}
">="                    {FIXLOC; return GTE;}
"<="                    {FIXLOC; return LTE;}
"("                     {FIXLOC; return '(';}
")"                     {FIXLOC; return ')';}
"+"                     {FIXLOC; return '+';}
"-"                     {FIXLOC; return '-';}
"*"                     {FIXLOC; return '*';}
"/"                     {FIXLOC; return '/';}
"%"                     {FIXLOC; return '%';}
"&&"                    {FIXLOC; return ANDAND;}
"||"                    {FIXLOC; return OROR;}
";"                     {FIXLOC; return ';';}
":"                     {FIXLOC; return ':';}
","                     {FIXLOC; return ',';}
"@"                     {FIXLOC; return '@';}
"|"                     {FIXLOC; return '|';}
"["                     {FIXLOC; return '[';}
"]"                     {FIXLOC; return ']';}
"&"                     {FIXLOC; return '&';}
"^"                     {FIXLOC; return '^';}
"."                     {FIXLOC; return '.';}
"<<"                    {FIXLOC; return SHL;}
">>"                    {FIXLOC; return SHR;}
"PROCEDURE"             {FIXLOC; return PROCEDURE;}
"CALL"                  {FIXLOC; return CALL;}
"OR"                    {FIXLOC; return OR;}
"TO"                    {FIXLOC; return TO;}
"TOWARDS"               {FIXLOC; return TOWARDS;}
"TELEPORT-ANCHOR"       {FIXLOC; return TELEPORT_ANCHOR;}
"SILENT"                {FIXLOC; return SILENT;}
"LOCAL"                 {FIXLOC; return LOCAL;}
"NONMAGIC"              {FIXLOC; return NONMAGIC;}
"SPELL"                 {FIXLOC; return SPELL;}
"LET"                   {FIXLOC; return LET;}
"IN"                    {FIXLOC; return IN;}
"END"                   {FIXLOC; return END;}
"=>"                    {FIXLOC; return DARROW;}
"STRING"                {FIXLOC; return STRING_TY;}
"REQUIRE"               {FIXLOC; return REQUIRE;}
"CATALYSTS"             {FIXLOC; return CATALYSTS;}
"COMPONENTS"            {FIXLOC; return COMPONENTS;}
"MANA"                  {FIXLOC; return MANA;}
"CASTTIME"              {FIXLOC; return CASTTIME;}
"SKIP"                  {FIXLOC; return SKIP;}
"ABORT"                 {FIXLOC; return ABORT;}
"BREAK"                 {FIXLOC; return BREAK;}
"EFFECT"                {FIXLOC; return EFFECT_;}
"ATEND"                 {FIXLOC; return ATEND;}
"ATTRIGGER"             {FIXLOC; return ATTRIGGER;}
"CONST"                 {FIXLOC; return CONST;}
"PC"                    {FIXLOC; return PC_F;}
"NPC"                   {FIXLOC; return NPC_F;}
"MOB"                   {FIXLOC; return MOB_F;}
"ENTITY"                {FIXLOC; return ENTITY_F;}
"TARGET"                {FIXLOC; return TARGET_F;}
"IF"                    {FIXLOC; return IF;}
"THEN"                  {FIXLOC; return THEN;}
"ELSE"                  {FIXLOC; return ELSE;}
"FOREACH"               {FIXLOC; return FOREACH;}
"FOR"                   {FIXLOC; return FOR;}
"DO"                    {FIXLOC; return DO;}
"WAIT"                  {FIXLOC; return SLEEP;}

\{([^\}]|\\.)*\}        {
    magic_frontend_lval.s = dumb_string::copy(yytext);
    FIXLOC;
    return SCRIPT_DATA;
}

\"([^\"]|\\.)*\"        {
    dumb_string string = dumb_string::copy(yytext + 1);
    const char *src = string.c_str();
    char *dst = &string[0];
    while (*src && *src != '"')
    {
        if (*src == '\\')
        {
            *dst++ = src[1];
            src += 2;
        }
        else
            *dst++ = *src++;
    }
    *dst = '\0'; /* terminate */
    magic_frontend_lval.s = string;
    FIXLOC;
    return STRING;
}

"-"?[0-9]+              {
    magic_frontend_lval.i = atoi(yytext);
    FIXLOC;
    return INT;
 }

"0x"[0-9a-fA-F]+        {
    magic_frontend_lval.i = strtol(yytext + 2, NULL, 16);
    FIXLOC;
    return INT;
 }

[a-zA-Z][-_a-zA-Z0-9]*  {
    magic_frontend_lval.s = dumb_string::copy(yytext);
    FIXLOC;
    return ID;
}

"#".*$                  /* Ignore comments */
"//".*$                 /* Ignore comments */
[ \n\t\r]               /* ignore whitespace */
.                       FPRINTF(stderr, "%s: Unexpected character in line %d\n", MAGIC_CONFIG_FILE, magic_frontend_lineno);

%%