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

                                 
              
                                                                    





                                                                         

                                               










                                    



























































                                                         
                                                 














                                                   


                                                  
                          













                                                     
                          


                                 

                                                           


                                                                           
                             


                                                                   
                                   

                                        

                                     
                                       
                                                                                                                   


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

#include "../common/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;}

\{([^\}]|\\.)*\} { char *string = strdup(yytext);
                   magic_frontend_lval.s = string;
                   FIXLOC;
                   return SCRIPT_DATA;
                   }

\"([^\"]|\\.)*\" { char *string = strdup(yytext + 1);
                   char *src = string;
                   char *dst = string;
                   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 = strdup(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);


%%