mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-01 03:21:41 +00:00
added basic script parser (can only parse empty script bodies for now)
This commit is contained in:
parent
de8a651df4
commit
aa99a0dd56
@ -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)
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
47
components/compiler/scriptparser.cpp
Normal file
47
components/compiler/scriptparser.cpp
Normal file
@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
41
components/compiler/scriptparser.hpp
Normal file
41
components/compiler/scriptparser.hpp
Normal file
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user