Add expression parsing for menu parser

This commit is contained in:
Jan
2021-11-03 23:46:18 +01:00
parent c5d7d71a51
commit 69c08def7f
10 changed files with 505 additions and 25 deletions

View File

@ -8,6 +8,7 @@
#include "GenericStringPropertySequence.h"
#include "Parsing/Menu/Matcher/MenuMatcherFactory.h"
#include "Parsing/Menu/Domain/CommonMenuTypes.h"
#include "Parsing/Menu/Matcher/MenuCommonMatchers.h"
using namespace menu;
@ -63,6 +64,52 @@ namespace menu::menu_properties
state->m_current_menu->m_rect = rect;
}
};
class SequenceBooleanExpression final : public MenuFileParser::sequence_t
{
static constexpr auto CAPTURE_EXPRESSION = 1;
public:
explicit SequenceBooleanExpression(std::string keyword)
{
const MenuMatcherFactory create(this);
AddLabeledMatchers(MenuCommonMatchers::Expression(this), MenuCommonMatchers::LABEL_EXPRESSION);
AddMatchers({
create.KeywordIgnoreCase(std::move(keyword)),
create.Or({
create.And({
create.KeywordIgnoreCase("when"),
create.Char('('),
create.Label(MenuCommonMatchers::LABEL_EXPRESSION).Capture(CAPTURE_EXPRESSION),
create.Char(')')
}),
create.Label(MenuCommonMatchers::LABEL_EXPRESSION)
}),
create.Char(';')
});
}
protected:
void ProcessMatch(MenuFileParserState* state, SequenceResult<SimpleParserValue>& result) const override
{
assert(state->m_current_menu);
const auto expression = MenuCommonMatchers::ProcessExpression(state, result);
std::cout << "Evaluated expression!\n";
std::cout << " IsStatic: " << expression->IsStatic() << "\n";
const auto value = expression->Evaluate();
if(value.m_type == CommonExpressionValue::Type::DOUBLE)
std::cout << " Value: " << value.m_double_value << "\n";
else if(value.m_type == CommonExpressionValue::Type::INT)
std::cout << " Value: " << value.m_int_value << "\n";
else if (value.m_type == CommonExpressionValue::Type::STRING)
std::cout << " Value: \"" << *value.m_string_value << "\"\n";
}
};
}
using namespace menu_properties;
@ -187,4 +234,6 @@ void MenuPropertySequences::AddSequences(FeatureLevel featureLevel)
{
state->m_current_menu->m_text_only_focus = true;
}));
AddSequence(std::make_unique<SequenceBooleanExpression>("visible"));
}