Add permissive mode for menu parsing that accepts unknown script tokens as long as they can be put into the script

This commit is contained in:
Jan
2021-11-28 17:55:26 +01:00
parent e94c48338c
commit b082e471e7
24 changed files with 200 additions and 72 deletions

View File

@ -22,8 +22,8 @@ namespace menu
AbstractScopeSequenceHolder(const AbstractScopeSequenceHolder& other) = delete;
AbstractScopeSequenceHolder(AbstractScopeSequenceHolder&& other) noexcept = default;
AbstractScopeSequenceHolder& operator=(const AbstractScopeSequenceHolder& other) = delete;
AbstractScopeSequenceHolder& operator=(AbstractScopeSequenceHolder&& other) noexcept = default;
AbstractScopeSequenceHolder& operator=(AbstractScopeSequenceHolder&& other) noexcept = delete;
virtual void AddSequences(FeatureLevel featureLevel) = 0;
virtual void AddSequences(FeatureLevel featureLevel, bool permissive) = 0;
};
}

View File

@ -195,6 +195,59 @@ namespace menu::event_handler_set_scope_sequences
protected:
void ProcessMatch(MenuFileParserState* state, SequenceResult<SimpleParserValue>& result) const override
{
if (!state->m_current_script_statement_terminated)
{
state->m_current_script << "; ";
state->m_current_script_statement_terminated = true;
}
}
};
class SequenceSkipScriptToken final : public MenuFileParser::sequence_t
{
static constexpr auto CAPTURE_SCRIPT_TOKEN = 1;
public:
SequenceSkipScriptToken()
{
const ScriptMatcherFactory create(this);
AddMatchers({
create.Or({
create.Text(),
create.Numeric()
}).Capture(CAPTURE_SCRIPT_TOKEN)
});
}
protected:
void ProcessMatch(MenuFileParserState* state, SequenceResult<SimpleParserValue>& result) const override
{
const auto& capture = result.NextCapture(CAPTURE_SCRIPT_TOKEN);
switch(capture.m_type)
{
case SimpleParserValueType::STRING:
state->m_current_script << "\"" << capture.StringValue() << "\" ";
break;
case SimpleParserValueType::IDENTIFIER:
state->m_current_script << "\"" << capture.IdentifierValue() << "\" ";
break;
case SimpleParserValueType::INTEGER:
state->m_current_script << "\"" << capture.IntegerValue() << "\" ";
break;
case SimpleParserValueType::FLOATING_POINT:
state->m_current_script << "\"" << capture.FloatingPointValue() << "\" ";
break;
default:
throw ParsingException(capture.GetPos(), "Invalid script token type for skipping");
}
state->m_current_script_statement_terminated = false;
}
};
@ -611,7 +664,7 @@ EventHandlerSetScopeSequences::EventHandlerSetScopeSequences(std::vector<std::un
{
}
void EventHandlerSetScopeSequences::AddSequences(FeatureLevel featureLevel)
void EventHandlerSetScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive)
{
AddSequence(std::make_unique<SequenceSkipEmptyStatements>());
// If else and stuff
@ -704,4 +757,9 @@ void EventHandlerSetScopeSequences::AddSequences(FeatureLevel featureLevel)
AddSequence(std::make_unique<SequenceElseIf>());
AddSequence(std::make_unique<SequenceElse>());
AddSequence(std::make_unique<SequenceCloseBlock>());
if (permissive)
{
AddSequence(std::make_unique<SequenceSkipScriptToken>());
}
}

View File

@ -9,6 +9,6 @@ namespace menu
public:
EventHandlerSetScopeSequences(std::vector<std::unique_ptr<MenuFileParser::sequence_t>>& allSequences, std::vector<MenuFileParser::sequence_t*>& scopeSequences);
void AddSequences(FeatureLevel featureLevel) override;
void AddSequences(FeatureLevel featureLevel, bool permissive) override;
};
}

View File

@ -49,7 +49,7 @@ FunctionScopeSequences::FunctionScopeSequences(std::vector<std::unique_ptr<MenuF
{
}
void FunctionScopeSequences::AddSequences(FeatureLevel featureLevel)
void FunctionScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive)
{
AddSequence(std::make_unique<SequenceCloseBlock>());
AddSequence(std::make_unique<GenericStringPropertySequence>("name", [](const MenuFileParserState* state, const TokenPos&, const std::string& value)

View File

@ -9,6 +9,6 @@ namespace menu
public:
FunctionScopeSequences(std::vector<std::unique_ptr<MenuFileParser::sequence_t>>& allSequences, std::vector<MenuFileParser::sequence_t*>& scopeSequences);
void AddSequences(FeatureLevel featureLevel) override;
void AddSequences(FeatureLevel featureLevel, bool permissive) override;
};
}

View File

@ -107,7 +107,7 @@ GlobalScopeSequences::GlobalScopeSequences(std::vector<std::unique_ptr<MenuFileP
{
}
void GlobalScopeSequences::AddSequences(FeatureLevel featureLevel)
void GlobalScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive)
{
AddSequence(std::make_unique<SequenceCloseBlock>());
AddSequence(std::make_unique<SequenceFunctionDef>());

View File

@ -9,6 +9,6 @@ namespace menu
public:
GlobalScopeSequences(std::vector<std::unique_ptr<MenuFileParser::sequence_t>>& allSequences, std::vector<MenuFileParser::sequence_t*>& scopeSequences);
void AddSequences(FeatureLevel featureLevel) override;
void AddSequences(FeatureLevel featureLevel, bool permissive) override;
};
}

View File

@ -554,7 +554,7 @@ ItemScopeSequences::ItemScopeSequences(std::vector<std::unique_ptr<MenuFileParse
{
}
void ItemScopeSequences::AddSequences(FeatureLevel featureLevel)
void ItemScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive)
{
AddSequence(std::make_unique<SequenceCloseBlock>());
AddSequence(std::make_unique<GenericStringPropertySequence>("name", [](const MenuFileParserState* state, const TokenPos&, const std::string& value)

View File

@ -9,6 +9,6 @@ namespace menu
public:
ItemScopeSequences(std::vector<std::unique_ptr<MenuFileParser::sequence_t>>& allSequences, std::vector<MenuFileParser::sequence_t*>& scopeSequences);
void AddSequences(FeatureLevel featureLevel) override;
void AddSequences(FeatureLevel featureLevel, bool permissive) override;
};
}

View File

@ -225,7 +225,7 @@ MenuScopeSequences::MenuScopeSequences(std::vector<std::unique_ptr<MenuFileParse
{
}
void MenuScopeSequences::AddSequences(FeatureLevel featureLevel)
void MenuScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive)
{
AddSequence(std::make_unique<SequenceCloseBlock>());
AddSequence(std::make_unique<SequenceItemDef>());

View File

@ -9,6 +9,6 @@ namespace menu
public:
MenuScopeSequences(std::vector<std::unique_ptr<MenuFileParser::sequence_t>>& allSequences, std::vector<MenuFileParser::sequence_t*>& scopeSequences);
void AddSequences(FeatureLevel featureLevel) override;
void AddSequences(FeatureLevel featureLevel, bool permissive) override;
};
}

View File

@ -34,7 +34,7 @@ NoScopeSequences::NoScopeSequences(std::vector<std::unique_ptr<MenuFileParser::s
{
}
void NoScopeSequences::AddSequences(FeatureLevel featureLevel)
void NoScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive)
{
AddSequence(std::make_unique<SequenceOpenGlobalScope>());
}

View File

@ -9,6 +9,6 @@ namespace menu
public:
NoScopeSequences(std::vector<std::unique_ptr<MenuFileParser::sequence_t>>& allSequences, std::vector<MenuFileParser::sequence_t*>& scopeSequences);
void AddSequences(FeatureLevel featureLevel) override;
void AddSequences(FeatureLevel featureLevel, bool permissive) override;
};
}