#ifndef JINJA2CPP_SRC_EXPRESSION_PARSER_H #define JINJA2CPP_SRC_EXPRESSION_PARSER_H #include "lexer.h" #include "error_handling.h" #include "expression_evaluator.h" #include "renderer.h" #include #include namespace jinja2 { class ExpressionParser { public: template using ParseResult = nonstd::expected; explicit ExpressionParser(const Settings& settings, TemplateEnv* env = nullptr); ParseResult Parse(LexScanner& lexer); ParseResult> ParseFullExpression(LexScanner& lexer, bool includeIfPart = true); ParseResult ParseCallParams(LexScanner& lexer); ParseResult> ParseFilterExpression(LexScanner& lexer); private: ParseResult> ParseLogicalNot(LexScanner& lexer); ParseResult> ParseLogicalOr(LexScanner& lexer); ParseResult> ParseLogicalAnd(LexScanner& lexer); ParseResult> ParseLogicalCompare(LexScanner& lexer); ParseResult> ParseStringConcat(LexScanner& lexer); ParseResult> ParseMathPow(LexScanner& lexer); ParseResult> ParseMathMulDiv(LexScanner& lexer); ParseResult> ParseMathPlusMinus(LexScanner& lexer); ParseResult> ParseUnaryPlusMinus(LexScanner& lexer); ParseResult> ParseValueExpression(LexScanner& lexer); ParseResult> ParseBracedExpressionOrTuple(LexScanner& lexer); ParseResult> ParseDictionary(LexScanner& lexer); ParseResult> ParseTuple(LexScanner& lexer); ParseResult> ParseCall(LexScanner& lexer, ExpressionEvaluatorPtr valueRef); ParseResult> ParseSubscript(LexScanner& lexer, ExpressionEvaluatorPtr valueRef); ParseResult> ParseIfExpression(LexScanner& lexer); private: ComposedRenderer* m_topLevelRenderer = nullptr; }; } // namespace jinja2 #endif // JINJA2CPP_SRC_EXPRESSION_PARSER_H