/* =========================================================================== Copyright (C) 2000 - 2013, Raven Software, Inc. Copyright (C) 2001 - 2013, Activision, Inc. Copyright (C) 2013 - 2015, OpenJK contributors This file is part of the OpenJK source code. OpenJK is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . =========================================================================== */ // Interpreter.h #ifndef __INTERPRETER__ #define __INTERPRETER__ #define ICARUS_VERSION 1.33 #define MAX_STRING_SIZE 256 #define MAX_VAR_NAME 64 typedef float vector_t[3]; //Token defines enum { TK_BLOCK_START = TK_USERDEF, TK_BLOCK_END, TK_VECTOR_START, TK_VECTOR_END, TK_OPEN_PARENTHESIS, TK_CLOSED_PARENTHESIS, TK_VECTOR, TK_GREATER_THAN, TK_LESS_THAN, TK_EQUALS, TK_NOT, NUM_USER_TOKENS }; //ID defines enum { ID_AFFECT = NUM_USER_TOKENS, ID_SOUND, ID_MOVE, ID_ROTATE, ID_WAIT, ID_BLOCK_START, ID_BLOCK_END, ID_SET, ID_LOOP, ID_LOOPEND, ID_PRINT, ID_USE, ID_FLUSH, ID_RUN, ID_KILL, ID_REMOVE, ID_CAMERA, ID_GET, ID_RANDOM, ID_IF, ID_ELSE, ID_REM, ID_TASK, ID_DO, ID_DECLARE, ID_FREE, ID_DOWAIT, ID_SIGNAL, ID_WAITSIGNAL, ID_PLAY, ID_TAG, ID_EOF, NUM_IDS }; //Type defines enum { //Wait types TYPE_WAIT_COMPLETE = NUM_IDS, TYPE_WAIT_TRIGGERED, //Set types TYPE_ANGLES, TYPE_ORIGIN, //Affect types TYPE_INSERT, TYPE_FLUSH, //Camera types TYPE_PAN, TYPE_ZOOM, TYPE_MOVE, TYPE_FADE, TYPE_PATH, TYPE_ENABLE, TYPE_DISABLE, TYPE_SHAKE, TYPE_ROLL, TYPE_TRACK, TYPE_DISTANCE, TYPE_FOLLOW, //Variable type TYPE_VARIABLE, TYPE_EOF, NUM_TYPES }; enum { MSG_COMPLETED, MSG_EOF, NUM_MESSAGES, }; typedef struct variable_s { char name[MAX_VAR_NAME]; int type; void *data; } variable_t; typedef std::map< std::string, variable_t * > variable_m; typedef std::vector < variable_t * > variable_v; //CInterpreter class CInterpreter { public: CInterpreter(); ~CInterpreter(); int Interpret( CTokenizer *, CBlockStream *, char *filename=NULL ); //Main interpretation function int Match( int ); //Looks ahead to the next token to try and match it to the passed token, consumes token on success int LookAhead( int ); //Looks ahead without consuming on success int FindSymbol( const char *, keywordArray_t * ); //Searches the symbol table for the given name. Returns the ID if found int GetAffect( void ); //Handles the affect() function int GetWait( void ); //Handles the wait() function int GetSet( void ); //Handles the set() function int GetBroadcast( void ); //Handles the broadcast() function int GetLoop( void ); //Handles the loop() function int GetPrint( void ); //Handles the print() function int GetUse( void ); //Handles the use() function int GetFlush( void ); //Handles the flush() function int GetRun( void ); //Handles the run() function int GetKill( void ); //Handles the kill() function int GetRemove( void ); //Handles the remove() function int GetCamera( void ); //Handles the camera() function int GetIf( void ); //Handles the if() conditional statement int GetSound( void ); //Handles the sound() function int GetMove( void ); //Handles the move() function int GetRotate( void ); //Handles the rotate() function int GetRem( void ); //Handles the rem() function int GetTask( void ); int GetDo( void ); int GetElse( void ); int GetDeclare( void ); int GetFree( void ); int GetDoWait( void ); int GetSignal( void ); int GetWaitSignal( void ); int GetPlay( void ); int GetRandom( CBlock *block ); int GetGet( CBlock *block ); //Heh int GetTag( CBlock *block ); //Handles the tag() identifier int GetVector( CBlock *block ); int GetNextType( void ); int GetType( char *get ); int GetAny( CBlock *block ); int GetEvaluator( CBlock *block ); int GetString( CBlock *); //Attempts to match and retrieve the value of a string token int GetIdentifier( CBlock *get ); //Attempts to match and retrieve the value of an identifier token int GetInteger( CBlock * ); //Attempts to match and retrieve the value of a int token int GetFloat( CBlock * ); //Attempts to match and retrieve the value of a float token int GetVariable( int type ); int GetID ( char * ); //Attempts to match and interpret an identifier keywordArray_t *GetSymbols( void ) { return (keywordArray_t *) &m_symbolKeywords; } //Returns the interpreter's symbol table keywordArray_t *GetIDs( void ) { return (keywordArray_t *) &m_IDKeywords; } //Returns the interpreter's ID table keywordArray_t *GetTypes( void ) { return (keywordArray_t *) &m_typeKeywords; } //Returns the interpreter's type table protected: void InitVars( void ); void FreeVars( void ); variable_t *AddVar( const char *name, int type ); variable_t *FindVar( const char *name ); const char *GetTokenName( int ); //Returns the name of a token int Error( char *, ... ); //Prints an error message int MatchTag( void ); //Attempts to match to a tag identifier int MatchGet( void ); //Attempts to match to a get identifier int MatchRandom( void ); //Attempts to match to a random identifier CTokenizer *m_tokenizer; //Pointer to the tokenizer CBlockStream *m_blockStream; //Pointer to the block stream variable_v m_vars; variable_m m_varMap; std::string m_sCurrentLine; // used in IBIze error reporting for more clarity std::string m_sCurrentFile; // full-pathed name of .TXT file (needed because of above, which affects parsestreams) int m_iCurrentLine; // also needed now because of 'm_sCurrentLine' int m_iBadCBlockNumber; // used for final app return code (NZ = err) static keywordArray_t m_symbolKeywords[]; //Symbols static keywordArray_t m_IDKeywords[]; //Identifiers static keywordArray_t m_typeKeywords[]; //Types static keywordArray_t m_conditionalKeywords[]; //Conditional }; #endif //__INTERPRETER__