added basic script parser (can only parse empty script bodies for now)

pull/7/head
Marc Zinnschlag 15 years ago
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;

@ -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()
{
}
}

@ -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…
Cancel
Save