forked from teamnwah/openmw-tes3coop
added basic script parser (can only parse empty script bodies for now)
This commit is contained in:
parent
de8a651df4
commit
aa99a0dd56
5 changed files with 102 additions and 11 deletions
|
@ -67,7 +67,7 @@ set(MISC_HEADER components/misc/fileops.hpp components/misc/slice_array.hpp
|
||||||
source_group(misc FILES ${MISC} ${MISC_HEADER})
|
source_group(misc FILES ${MISC} ${MISC_HEADER})
|
||||||
|
|
||||||
set(COMPILER components/compiler/errorhandler.cpp
|
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/parser.cpp components/compiler/scanner.cpp
|
||||||
components/compiler/streamerrorhandler.cpp)
|
components/compiler/streamerrorhandler.cpp)
|
||||||
file(GLOB COMPILER_HEADER components/compiler/*.hpp)
|
file(GLOB COMPILER_HEADER components/compiler/*.hpp)
|
||||||
|
|
|
@ -8,7 +8,9 @@
|
||||||
namespace Compiler
|
namespace Compiler
|
||||||
{
|
{
|
||||||
FileParser::FileParser (ErrorHandler& errorHandler, Context& context)
|
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
|
std::string FileParser::getName() const
|
||||||
|
@ -47,12 +49,6 @@ namespace Compiler
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mState==EndState && keyword==Scanner::K_end)
|
|
||||||
{
|
|
||||||
mState = EndNameState;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Parser::parseKeyword (keyword, loc, scanner);
|
return Parser::parseKeyword (keyword, loc, scanner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,8 +58,12 @@ namespace Compiler
|
||||||
{
|
{
|
||||||
if (mState==BeginCompleteState)
|
if (mState==BeginCompleteState)
|
||||||
{
|
{
|
||||||
// TODO: add script parser here
|
// parse the script body
|
||||||
mState = EndState;
|
mScriptParser.reset();
|
||||||
|
|
||||||
|
scanner.scan (mScriptParser);
|
||||||
|
|
||||||
|
mState = EndNameState;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ namespace Compiler
|
||||||
{
|
{
|
||||||
mState = BeginState;
|
mState = BeginState;
|
||||||
mName.clear();
|
mName.clear();
|
||||||
|
mScriptParser.reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define COMPILER_FILEPARSER_H_INCLUDED
|
#define COMPILER_FILEPARSER_H_INCLUDED
|
||||||
|
|
||||||
#include "parser.hpp"
|
#include "parser.hpp"
|
||||||
|
#include "scriptparser.hpp"
|
||||||
|
|
||||||
namespace Compiler
|
namespace Compiler
|
||||||
{
|
{
|
||||||
|
@ -11,10 +12,11 @@ namespace Compiler
|
||||||
{
|
{
|
||||||
enum State
|
enum State
|
||||||
{
|
{
|
||||||
BeginState, NameState, BeginCompleteState, EndState, EndNameState,
|
BeginState, NameState, BeginCompleteState, EndNameState,
|
||||||
EndCompleteState
|
EndCompleteState
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ScriptParser mScriptParser;
|
||||||
State mState;
|
State mState;
|
||||||
std::string mName;
|
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 a new issue