123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- #ifndef _CONSOLE_PARSER_H_
- #define _CONSOLE_PARSER_H_
- #include <stdio.h>
- /// @ingroup console_system Console System
- /// @{
- namespace Compiler
- {
- //-----------------------------------------------------------------------------
- /// \brief Function for GetCurrentFile from the lexer
- //-----------------------------------------------------------------------------
- typedef const char *(*fnGetCurrentFile)();
- //-----------------------------------------------------------------------------
- /// \brief Function for GetCurrentLine from the lexer
- //-----------------------------------------------------------------------------
- typedef S32 (*fnGetCurrentLine)();
- //-----------------------------------------------------------------------------
- /// \brief Function for Parse from the lexer
- //-----------------------------------------------------------------------------
- typedef S32 (*fnParse)();
- //-----------------------------------------------------------------------------
- /// \brief Function for Restart from the lexer
- //-----------------------------------------------------------------------------
- typedef void (*fnRestart)(FILE *input_file);
- //-----------------------------------------------------------------------------
- /// \brief Function for SetScanBuffer from the lexer
- //-----------------------------------------------------------------------------
- typedef void (*fnSetScanBuffer)(const char *sb, const char *fn);
- //-----------------------------------------------------------------------------
- /// \brief List of parsers for the compiler
- //-----------------------------------------------------------------------------
- struct ConsoleParser
- {
- struct ConsoleParser *next; //!< Next object in list or NULL
- char *ext; //!< Filename extension handled by this parser
-
- fnGetCurrentFile getCurrentFile; //!< GetCurrentFile lexer function
- fnGetCurrentLine getCurrentLine; //!< GetCurrentLine lexer function
- fnParse parse; //!< Parse lexer function
- fnRestart restart; //!< Restart lexer function
- fnSetScanBuffer setScanBuffer; //!< SetScanBuffer lexer function
- };
- // Macros
- //-----------------------------------------------------------------------------
- /// \brief Declare a parser's function prototypes
- //-----------------------------------------------------------------------------
- #define CON_DECLARE_PARSER(prefix) \
- const char * prefix##GetCurrentFile(); \
- S32 prefix##GetCurrentLine(); \
- void prefix##SetScanBuffer(const char *sb, const char *fn); \
- S32 prefix##parse(); \
- void prefix##restart(FILE *input_file)
- //-----------------------------------------------------------------------------
- /// \brief Helper macro to add console parsers
- //-----------------------------------------------------------------------------
- #define CON_ADD_PARSER(prefix, ext, def) \
- Compiler::addConsoleParser(ext, prefix##GetCurrentFile, prefix##GetCurrentLine, prefix##parse, \
- prefix##restart, prefix##SetScanBuffer, def)
- //-----------------------------------------------------------------------------
- /// \brief Free the console parser list
- ///
- /// \sa AddConsoleParser()
- //-----------------------------------------------------------------------------
- void freeConsoleParserList(void);
- //-----------------------------------------------------------------------------
- /// \brief Add a console parser to the list
- ///
- /// \param ext Filename extension
- /// \param gcf GetCurrentFile function
- /// \param gcl GetCurrentLine function
- /// \param p Parse function
- /// \param r Restart function
- /// \param ssb SetScanBuffer function
- /// \param def true if this is the default parser (<b>Note:</b> set this only on the .tscript parser!)
- /// \return true for success, false for failure (out of memory)
- /// \sa FreeConsoleParserList(), ConsoleParser
- //-----------------------------------------------------------------------------
- bool addConsoleParser(char *ext, fnGetCurrentFile gcf, fnGetCurrentLine gcl, fnParse p, fnRestart r, fnSetScanBuffer ssb, bool def = false);
- //-----------------------------------------------------------------------------
- /// \brief Get the parser for a particular file based on its extension
- ///
- /// \param filename Filename of file to obtain parser for
- /// \sa ConsoleParser
- //-----------------------------------------------------------------------------
- ConsoleParser * getParserForFile(const char *filename);
- } // end namespace Con
- /// @}
- #endif // _CONSOLE_PARSER_H_
|