diff --git a/CMakeLists.txt b/CMakeLists.txt index 9457acf53..d9e793754 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,7 @@ set(MISC_HEADER components/misc/fileops.hpp components/misc/slice_array.hpp source_group(misc FILES ${MISC} ${MISC_HEADER}) set(COMPILER components/compiler/errorhandler.cpp - components/compiler/fileparser.cpp + components/compiler/fileparser.cpp components/compiler/scriptparser.cpp components/compiler/parser.cpp components/compiler/scanner.cpp components/compiler/streamerrorhandler.cpp) file(GLOB COMPILER_HEADER components/compiler/*.hpp) diff --git a/components/compiler/fileparser.cpp b/components/compiler/fileparser.cpp index 388f8df03..9894bce67 100644 --- a/components/compiler/fileparser.cpp +++ b/components/compiler/fileparser.cpp @@ -8,7 +8,9 @@ namespace Compiler { FileParser::FileParser (ErrorHandler& errorHandler, Context& context) - : Parser (errorHandler, context), mState (BeginState) + : Parser (errorHandler, context), + mScriptParser (errorHandler, context, true), + mState (BeginState) {} std::string FileParser::getName() const @@ -47,12 +49,6 @@ namespace Compiler return true; } - if (mState==EndState && keyword==Scanner::K_end) - { - mState = EndNameState; - return true; - } - return Parser::parseKeyword (keyword, loc, scanner); } @@ -62,8 +58,12 @@ namespace Compiler { if (mState==BeginCompleteState) { - // TODO: add script parser here - mState = EndState; + // parse the script body + mScriptParser.reset(); + + scanner.scan (mScriptParser); + + mState = EndNameState; return true; } @@ -87,6 +87,7 @@ namespace Compiler { mState = BeginState; mName.clear(); + mScriptParser.reset(); } } diff --git a/components/compiler/fileparser.hpp b/components/compiler/fileparser.hpp index 6ae086216..81b8025ce 100644 --- a/components/compiler/fileparser.hpp +++ b/components/compiler/fileparser.hpp @@ -2,6 +2,7 @@ #define COMPILER_FILEPARSER_H_INCLUDED #include "parser.hpp" +#include "scriptparser.hpp" namespace Compiler { @@ -11,10 +12,11 @@ namespace Compiler { enum State { - BeginState, NameState, BeginCompleteState, EndState, EndNameState, + BeginState, NameState, BeginCompleteState, EndNameState, EndCompleteState }; + ScriptParser mScriptParser; State mState; std::string mName; diff --git a/components/compiler/scriptparser.cpp b/components/compiler/scriptparser.cpp new file mode 100644 index 000000000..2247ed408 --- /dev/null +++ b/components/compiler/scriptparser.cpp @@ -0,0 +1,47 @@ + +#include "scriptparser.hpp" + +#include "scanner.hpp" + +namespace Compiler +{ + ScriptParser::ScriptParser (ErrorHandler& errorHandler, Context& context, bool end) + : Parser (errorHandler, context), mEnd (end) + {} + + bool ScriptParser::parseName (const std::string& name, const TokenLoc& loc, + Scanner& scanner) + { + return Parser::parseName (name, loc, scanner); + } + + bool ScriptParser::parseKeyword (int keyword, const TokenLoc& loc, Scanner& scanner) + { + if (keyword==Scanner::K_end && mEnd) + { + return false; + } + + return Parser::parseKeyword (keyword, loc, scanner); + } + + bool ScriptParser::parseSpecial (int code, const TokenLoc& loc, Scanner& scanner) + { + if (code==Scanner::S_newline) // empty line + return true; + + return Parser::parseSpecial (code, loc, scanner); + } + + void ScriptParser::parseEOF (Scanner& scanner) + { + if (mEnd) + Parser::parseEOF (scanner); + } + + void ScriptParser::reset() + { + + } +} + diff --git a/components/compiler/scriptparser.hpp b/components/compiler/scriptparser.hpp new file mode 100644 index 000000000..1a726b86e --- /dev/null +++ b/components/compiler/scriptparser.hpp @@ -0,0 +1,41 @@ +#ifndef COMPILER_SCRIPTPARSER_H_INCLUDED +#define COMPILER_SCRIPTPARSER_H_INCLUDED + +#include "parser.hpp" + +namespace Compiler +{ + // Script parser, to be used in dialogue scripts and as part of FileParser + + class ScriptParser : public Parser + { + bool mEnd; + + public: + + /// \param end of script is marked by end keyword. + ScriptParser (ErrorHandler& errorHandler, Context& context, bool end = false); + + virtual bool parseName (const std::string& name, const TokenLoc& loc, + Scanner& scanner); + ///< Handle a name token. + /// \return fetch another token? + + virtual bool parseKeyword (int keyword, const TokenLoc& loc, Scanner& scanner); + ///< Handle a keyword token. + /// \return fetch another token? + + virtual bool parseSpecial (int code, const TokenLoc& loc, Scanner& scanner); + ///< Handle a special character token. + /// \return fetch another token? + + virtual void parseEOF (Scanner& scanner); + ///< Handle EOF token. + + void reset(); + ///< Reset parser to clean state. + }; +} + +#endif +