Rename defines if directive parsing to defines directive parsing

This commit is contained in:
Jan 2022-09-05 20:17:31 +02:00
parent b2313c6415
commit 4ef38264c8
15 changed files with 94 additions and 93 deletions

View File

@ -0,0 +1,16 @@
#include "DefinesDirectiveExpressionSequence.h"
#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h"
#include "DefinesExpressionMatchers.h"
DefinesDirectiveExpressionSequence::DefinesDirectiveExpressionSequence()
{
const SimpleMatcherFactory create(this);
AddLabeledMatchers(DefinesExpressionMatchers().Expression(this), SimpleExpressionMatchers::LABEL_EXPRESSION);
AddMatchers(create.Label(SimpleExpressionMatchers::LABEL_EXPRESSION));
}
void DefinesDirectiveExpressionSequence::ProcessMatch(DefinesDirectiveParsingState* state, SequenceResult<SimpleParserValue>& result) const
{
state->m_expression = DefinesExpressionMatchers(state).ProcessExpression(result);
}

View File

@ -0,0 +1,13 @@
#pragma once
#include "DefinesDirectiveParser.h"
#include "DefinesDirectiveParsingState.h"
class DefinesDirectiveExpressionSequence final : public DefinesDirectiveParser::sequence_t
{
public:
DefinesDirectiveExpressionSequence();
protected:
void ProcessMatch(DefinesDirectiveParsingState* state, SequenceResult<SimpleParserValue>& result) const override;
};

View File

@ -0,0 +1,22 @@
#include "DefinesDirectiveParser.h"
#include "DefinesDirectiveExpressionSequence.h"
DefinesDirectiveParser::DefinesDirectiveParser(ILexer<SimpleParserValue>* lexer, const std::map<std::string, DefinesStreamProxy::Define>& defines)
: AbstractParser<SimpleParserValue, DefinesDirectiveParsingState>(lexer, std::make_unique<DefinesDirectiveParsingState>(defines))
{
}
const std::vector<AbstractParser<SimpleParserValue, DefinesDirectiveParsingState>::sequence_t*>& DefinesDirectiveParser::GetTestsForState()
{
static std::vector<sequence_t*> sequences
{
new DefinesDirectiveExpressionSequence()
};
return sequences;
}
std::unique_ptr<ISimpleExpression> DefinesDirectiveParser::GetParsedExpression() const
{
return std::move(m_state->m_expression);
}

View File

@ -0,0 +1,17 @@
#pragma once
#include "DefinesDirectiveParsingState.h"
#include "Parsing/Impl/AbstractParser.h"
#include "Parsing/Simple/SimpleParserValue.h"
class DefinesDirectiveParser final : public AbstractParser<SimpleParserValue, DefinesDirectiveParsingState>
{
public:
DefinesDirectiveParser(ILexer<SimpleParserValue>* lexer, const std::map<std::string, DefinesStreamProxy::Define>& defines);
protected:
const std::vector<sequence_t*>& GetTestsForState() override;
public:
_NODISCARD std::unique_ptr<ISimpleExpression> GetParsedExpression() const;
};

View File

@ -0,0 +1,6 @@
#include "DefinesDirectiveParsingState.h"
DefinesDirectiveParsingState::DefinesDirectiveParsingState(const std::map<std::string, DefinesStreamProxy::Define>& defines)
: m_defines(defines)
{
}

View File

@ -6,11 +6,11 @@
#include "Parsing/Impl/DefinesStreamProxy.h" #include "Parsing/Impl/DefinesStreamProxy.h"
#include "Parsing/Simple/Expression/ISimpleExpression.h" #include "Parsing/Simple/Expression/ISimpleExpression.h"
class DefinesIfDirectiveParsingState class DefinesDirectiveParsingState
{ {
public: public:
const std::map<std::string, DefinesStreamProxy::Define>& m_defines; const std::map<std::string, DefinesStreamProxy::Define>& m_defines;
std::unique_ptr<ISimpleExpression> m_expression; std::unique_ptr<ISimpleExpression> m_expression;
explicit DefinesIfDirectiveParsingState(const std::map<std::string, DefinesStreamProxy::Define>& defines); explicit DefinesDirectiveParsingState(const std::map<std::string, DefinesStreamProxy::Define>& defines);
}; };

View File

@ -1,19 +1,19 @@
#include "DefinesIfExpressionMatchers.h" #include "DefinesExpressionMatchers.h"
#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" #include "Parsing/Simple/Matcher/SimpleMatcherFactory.h"
DefinesIfExpressionMatchers::DefinesIfExpressionMatchers() DefinesExpressionMatchers::DefinesExpressionMatchers()
: DefinesIfExpressionMatchers(nullptr) : DefinesExpressionMatchers(nullptr)
{ {
} }
DefinesIfExpressionMatchers::DefinesIfExpressionMatchers(const DefinesIfDirectiveParsingState* state) DefinesExpressionMatchers::DefinesExpressionMatchers(const DefinesDirectiveParsingState* state)
: SimpleExpressionMatchers(false, false, true, true, false), : SimpleExpressionMatchers(false, false, true, true, false),
m_state(state) m_state(state)
{ {
} }
std::unique_ptr<SimpleExpressionMatchers::matcher_t> DefinesIfExpressionMatchers::ParseOperandExtension(const supplier_t* labelSupplier) const std::unique_ptr<SimpleExpressionMatchers::matcher_t> DefinesExpressionMatchers::ParseOperandExtension(const supplier_t* labelSupplier) const
{ {
const SimpleMatcherFactory create(labelSupplier); const SimpleMatcherFactory create(labelSupplier);
@ -25,7 +25,7 @@ std::unique_ptr<SimpleExpressionMatchers::matcher_t> DefinesIfExpressionMatchers
}); });
} }
std::unique_ptr<ISimpleExpression> DefinesIfExpressionMatchers::ProcessOperandExtension(SequenceResult<SimpleParserValue>& result) const std::unique_ptr<ISimpleExpression> DefinesExpressionMatchers::ProcessOperandExtension(SequenceResult<SimpleParserValue>& result) const
{ {
const auto& defineCapture = result.NextCapture(CAPTURE_DEFINE_NAME); const auto& defineCapture = result.NextCapture(CAPTURE_DEFINE_NAME);

View File

@ -2,20 +2,20 @@
#include <memory> #include <memory>
#include "DefinesIfDirectiveParsingState.h" #include "DefinesDirectiveParsingState.h"
#include "Parsing/Simple/Expression/SimpleExpressionMatchers.h" #include "Parsing/Simple/Expression/SimpleExpressionMatchers.h"
class DefinesIfExpressionMatchers final : public SimpleExpressionMatchers class DefinesExpressionMatchers final : public SimpleExpressionMatchers
{ {
static constexpr auto CAPTURE_DEFINE_NAME = CAPTURE_OFFSET_EXPRESSION_EXT + 1; static constexpr auto CAPTURE_DEFINE_NAME = CAPTURE_OFFSET_EXPRESSION_EXT + 1;
const DefinesIfDirectiveParsingState* m_state; const DefinesDirectiveParsingState* m_state;
protected: protected:
std::unique_ptr<matcher_t> ParseOperandExtension(const supplier_t* labelSupplier) const override; std::unique_ptr<matcher_t> ParseOperandExtension(const supplier_t* labelSupplier) const override;
std::unique_ptr<ISimpleExpression> ProcessOperandExtension(SequenceResult<SimpleParserValue>& result) const override; std::unique_ptr<ISimpleExpression> ProcessOperandExtension(SequenceResult<SimpleParserValue>& result) const override;
public: public:
DefinesIfExpressionMatchers(); DefinesExpressionMatchers();
explicit DefinesIfExpressionMatchers(const DefinesIfDirectiveParsingState* state); explicit DefinesExpressionMatchers(const DefinesDirectiveParsingState* state);
}; };

View File

@ -1,16 +0,0 @@
#include "DefinesIfDirectiveExpressionSequence.h"
#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h"
#include "DefinesIfExpressionMatchers.h"
DefinesIfDirectiveExpressionSequence::DefinesIfDirectiveExpressionSequence()
{
const SimpleMatcherFactory create(this);
AddLabeledMatchers(DefinesIfExpressionMatchers().Expression(this), SimpleExpressionMatchers::LABEL_EXPRESSION);
AddMatchers(create.Label(SimpleExpressionMatchers::LABEL_EXPRESSION));
}
void DefinesIfDirectiveExpressionSequence::ProcessMatch(DefinesIfDirectiveParsingState* state, SequenceResult<SimpleParserValue>& result) const
{
state->m_expression = DefinesIfExpressionMatchers(state).ProcessExpression(result);
}

View File

@ -1,13 +0,0 @@
#pragma once
#include "DefinesIfDirectiveParser.h"
#include "DefinesIfDirectiveParsingState.h"
class DefinesIfDirectiveExpressionSequence final : public DefinesIfDirectiveParser::sequence_t
{
public:
DefinesIfDirectiveExpressionSequence();
protected:
void ProcessMatch(DefinesIfDirectiveParsingState* state, SequenceResult<SimpleParserValue>& result) const override;
};

View File

@ -1,22 +0,0 @@
#include "DefinesIfDirectiveParser.h"
#include "DefinesIfDirectiveExpressionSequence.h"
DefinesIfDirectiveParser::DefinesIfDirectiveParser(ILexer<SimpleParserValue>* lexer, const std::map<std::string, DefinesStreamProxy::Define>& defines)
: AbstractParser<SimpleParserValue, DefinesIfDirectiveParsingState>(lexer, std::make_unique<DefinesIfDirectiveParsingState>(defines))
{
}
const std::vector<AbstractParser<SimpleParserValue, DefinesIfDirectiveParsingState>::sequence_t*>& DefinesIfDirectiveParser::GetTestsForState()
{
static std::vector<sequence_t*> sequences
{
new DefinesIfDirectiveExpressionSequence()
};
return sequences;
}
std::unique_ptr<ISimpleExpression> DefinesIfDirectiveParser::GetParsedExpression() const
{
return std::move(m_state->m_expression);
}

View File

@ -1,17 +0,0 @@
#pragma once
#include "DefinesIfDirectiveParsingState.h"
#include "Parsing/Impl/AbstractParser.h"
#include "Parsing/Simple/SimpleParserValue.h"
class DefinesIfDirectiveParser final : public AbstractParser<SimpleParserValue, DefinesIfDirectiveParsingState>
{
public:
DefinesIfDirectiveParser(ILexer<SimpleParserValue>* lexer, const std::map<std::string, DefinesStreamProxy::Define>& defines);
protected:
const std::vector<sequence_t*>& GetTestsForState() override;
public:
_NODISCARD std::unique_ptr<ISimpleExpression> GetParsedExpression() const;
};

View File

@ -1,6 +0,0 @@
#include "DefinesIfDirectiveParsingState.h"
DefinesIfDirectiveParsingState::DefinesIfDirectiveParsingState(const std::map<std::string, DefinesStreamProxy::Define>& defines)
: m_defines(defines)
{
}

View File

@ -6,7 +6,7 @@
#include "Utils/ClassUtils.h" #include "Utils/ClassUtils.h"
#include "AbstractParser.h" #include "AbstractParser.h"
#include "ParserSingleInputStream.h" #include "ParserSingleInputStream.h"
#include "Defines/DefinesIfDirectiveParser.h" #include "Defines/DefinesDirectiveParser.h"
#include "Parsing/ParsingException.h" #include "Parsing/ParsingException.h"
#include "Parsing/Simple/SimpleLexer.h" #include "Parsing/Simple/SimpleLexer.h"
#include "Parsing/Simple/Expression/ISimpleExpression.h" #include "Parsing/Simple/Expression/ISimpleExpression.h"
@ -278,7 +278,7 @@ bool DefinesStreamProxy::MatchUndefDirective(const ParserLine& line, const unsig
return true; return true;
} }
std::unique_ptr<ISimpleExpression> DefinesStreamProxy::ParseIfExpression(const std::string& expressionString) const std::unique_ptr<ISimpleExpression> DefinesStreamProxy::ParseExpression(const std::string& expressionString) const
{ {
std::istringstream ss(expressionString); std::istringstream ss(expressionString);
ParserSingleInputStream inputStream(ss, "#if expression"); ParserSingleInputStream inputStream(ss, "#if expression");
@ -291,7 +291,7 @@ std::unique_ptr<ISimpleExpression> DefinesStreamProxy::ParseIfExpression(const s
SimpleExpressionMatchers().ApplyTokensToLexerConfig(lexerConfig); SimpleExpressionMatchers().ApplyTokensToLexerConfig(lexerConfig);
SimpleLexer lexer(&inputStream, std::move(lexerConfig)); SimpleLexer lexer(&inputStream, std::move(lexerConfig));
DefinesIfDirectiveParser parser(&lexer, m_defines); DefinesDirectiveParser parser(&lexer, m_defines);
if (!parser.Parse()) if (!parser.Parse())
return nullptr; return nullptr;
@ -323,7 +323,7 @@ bool DefinesStreamProxy::MatchIfDirective(const ParserLine& line, const unsigned
if (expressionString.empty()) if (expressionString.empty())
throw ParsingException(CreatePos(line, currentPos), "Cannot if without an expression."); throw ParsingException(CreatePos(line, currentPos), "Cannot if without an expression.");
const auto expression = ParseIfExpression(expressionString); const auto expression = ParseExpression(expressionString);
if (!expression) if (!expression)
throw ParsingException(CreatePos(line, currentPos), "Failed to parse if expression"); throw ParsingException(CreatePos(line, currentPos), "Failed to parse if expression");
@ -365,7 +365,7 @@ bool DefinesStreamProxy::MatchElIfDirective(const ParserLine& line, const unsign
if (expressionString.empty()) if (expressionString.empty())
throw ParsingException(CreatePos(line, currentPos), "Cannot elif without an expression."); throw ParsingException(CreatePos(line, currentPos), "Cannot elif without an expression.");
const auto expression = ParseIfExpression(expressionString); const auto expression = ParseExpression(expressionString);
if (!expression) if (!expression)
throw ParsingException(CreatePos(line, currentPos), "Failed to parse elif expression"); throw ParsingException(CreatePos(line, currentPos), "Failed to parse elif expression");

View File

@ -66,7 +66,6 @@ private:
static int GetLineEndEscapePos(const ParserLine& line); static int GetLineEndEscapePos(const ParserLine& line);
static std::vector<std::string> MatchDefineParameters(const ParserLine& line, unsigned& parameterPosition); static std::vector<std::string> MatchDefineParameters(const ParserLine& line, unsigned& parameterPosition);
void ContinueDefine(const ParserLine& line); void ContinueDefine(const ParserLine& line);
_NODISCARD std::unique_ptr<ISimpleExpression> ParseIfExpression(const std::string& expressionString) const;
_NODISCARD bool MatchDefineDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition); _NODISCARD bool MatchDefineDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchUndefDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition); _NODISCARD bool MatchUndefDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchIfDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition); _NODISCARD bool MatchIfDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
@ -86,6 +85,8 @@ public:
void AddDefine(Define define); void AddDefine(Define define);
void Undefine(const std::string& name); void Undefine(const std::string& name);
_NODISCARD std::unique_ptr<ISimpleExpression> ParseExpression(const std::string& expressionString) const;
ParserLine NextLine() override; ParserLine NextLine() override;
bool IncludeFile(const std::string& filename) override; bool IncludeFile(const std::string& filename) override;
void PopCurrentFile() override; void PopCurrentFile() override;