mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2026-09-09 23:47:07 +00:00
Support static expressions for menu simple string properties
This commit is contained in:
@@ -58,6 +58,20 @@ MatcherFactoryWrapper<SimpleParserValue> MenuMatcherFactory::Numeric() const
|
||||
}));
|
||||
}
|
||||
|
||||
MatcherFactoryWrapper<SimpleParserValue> MenuMatcherFactory::TextExpression() const
|
||||
{
|
||||
return MatcherFactoryWrapper(Or({
|
||||
StringChain().Tag(TAG_STRING_CHAIN).Capture(CAPTURE_STRING_CHAIN),
|
||||
Identifier().Tag(TAG_IDENTIFIER).Capture(CAPTURE_IDENTIFIER),
|
||||
And({
|
||||
Char('(').Capture(CAPTURE_FIRST_TOKEN),
|
||||
Label(MenuExpressionMatchers::LABEL_EXPRESSION),
|
||||
Char(')'),
|
||||
})
|
||||
.Tag(TAG_EXPRESSION),
|
||||
}));
|
||||
}
|
||||
|
||||
MatcherFactoryWrapper<SimpleParserValue> MenuMatcherFactory::IntExpression() const
|
||||
{
|
||||
return MatcherFactoryWrapper(Or({
|
||||
@@ -144,6 +158,42 @@ int MenuMatcherFactory::TokenIntExpressionValue(MenuFileParserState* state, Sequ
|
||||
throw ParsingException(TokenPos(), "TokenIntExpressionValue must be expression or int");
|
||||
}
|
||||
|
||||
std::string MenuMatcherFactory::TokenTextExpressionValue(MenuFileParserState* state, SequenceResult<SimpleParserValue>& result)
|
||||
{
|
||||
const auto nextTag = result.PeekTag();
|
||||
|
||||
assert(nextTag == TAG_STRING_CHAIN || nextTag == TAG_IDENTIFIER || nextTag == TAG_EXPRESSION);
|
||||
if (nextTag == TAG_STRING_CHAIN)
|
||||
{
|
||||
result.NextTag();
|
||||
return result.NextCapture(CAPTURE_STRING_CHAIN).StringValue();
|
||||
}
|
||||
|
||||
if (nextTag == TAG_IDENTIFIER)
|
||||
{
|
||||
result.NextTag();
|
||||
return result.NextCapture(CAPTURE_IDENTIFIER).IdentifierValue();
|
||||
}
|
||||
|
||||
if (nextTag == TAG_EXPRESSION)
|
||||
{
|
||||
result.NextTag();
|
||||
const auto expression = MenuExpressionMatchers(state).ProcessExpression(result);
|
||||
|
||||
if (!expression || !expression->IsStatic())
|
||||
throw ParsingException(result.NextCapture(CAPTURE_FIRST_TOKEN).GetPos(), "Not a valid static expression");
|
||||
|
||||
const auto value = expression->EvaluateStatic();
|
||||
|
||||
if (value.m_type != SimpleExpressionValue::Type::STRING)
|
||||
throw ParsingException(result.NextCapture(CAPTURE_FIRST_TOKEN).GetPos(), "Expression MUST be string type");
|
||||
|
||||
return std::move(*value.m_string_value);
|
||||
}
|
||||
|
||||
throw ParsingException(TokenPos(), "TokenIntExpressionValue must be expression or int");
|
||||
}
|
||||
|
||||
double MenuMatcherFactory::TokenNumericExpressionValue(MenuFileParserState* state, SequenceResult<SimpleParserValue>& result)
|
||||
{
|
||||
const auto nextTag = result.PeekTag();
|
||||
|
||||
@@ -8,13 +8,17 @@ namespace menu
|
||||
{
|
||||
class MenuMatcherFactory : public SimpleMatcherFactory
|
||||
{
|
||||
static constexpr auto TAG_INT = 1420;
|
||||
static constexpr auto TAG_NUMERIC = 1421;
|
||||
static constexpr auto TAG_EXPRESSION = 1422;
|
||||
static constexpr auto TAG_STRING_CHAIN = 1420;
|
||||
static constexpr auto TAG_IDENTIFIER = 1421;
|
||||
static constexpr auto TAG_INT = 1422;
|
||||
static constexpr auto TAG_NUMERIC = 1423;
|
||||
static constexpr auto TAG_EXPRESSION = 1424;
|
||||
|
||||
static constexpr auto CAPTURE_FIRST_TOKEN = 1420;
|
||||
static constexpr auto CAPTURE_INT = 1421;
|
||||
static constexpr auto CAPTURE_NUMERIC = 1422;
|
||||
static constexpr auto CAPTURE_STRING_CHAIN = 1421;
|
||||
static constexpr auto CAPTURE_IDENTIFIER = 1422;
|
||||
static constexpr auto CAPTURE_INT = 1423;
|
||||
static constexpr auto CAPTURE_NUMERIC = 1424;
|
||||
|
||||
public:
|
||||
explicit MenuMatcherFactory(const IMatcherForLabelSupplier<SimpleParserValue>* labelSupplier);
|
||||
@@ -24,6 +28,7 @@ namespace menu
|
||||
_NODISCARD MatcherFactoryWrapper<SimpleParserValue> TextNoChain() const;
|
||||
_NODISCARD MatcherFactoryWrapper<SimpleParserValue> Numeric() const;
|
||||
|
||||
_NODISCARD MatcherFactoryWrapper<SimpleParserValue> TextExpression() const;
|
||||
_NODISCARD MatcherFactoryWrapper<SimpleParserValue> IntExpression() const;
|
||||
_NODISCARD MatcherFactoryWrapper<SimpleParserValue> NumericExpression() const;
|
||||
|
||||
@@ -31,6 +36,7 @@ namespace menu
|
||||
_NODISCARD static double TokenNumericFloatingPointValue(const SimpleParserValue& value);
|
||||
_NODISCARD static std::string& TokenTextValue(const SimpleParserValue& value);
|
||||
|
||||
_NODISCARD static std::string TokenTextExpressionValue(MenuFileParserState* state, SequenceResult<SimpleParserValue>& result);
|
||||
_NODISCARD static int TokenIntExpressionValue(MenuFileParserState* state, SequenceResult<SimpleParserValue>& result);
|
||||
_NODISCARD static double TokenNumericExpressionValue(MenuFileParserState* state, SequenceResult<SimpleParserValue>& result);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user