39 #include <boost/spirit/include/qi.hpp>
40 #include <boost/phoenix.hpp>
46 namespace jmespath {
namespace parser {
48 namespace qi = boost::spirit::qi;
49 namespace encoding = qi::unicode;
50 namespace phx = boost::phoenix;
62 template <
typename Iterator,
typename Skipper = encoding::space_type>
63 class Grammar :
public qi::grammar<Iterator,
64 ast::ExpressionNode(),
74 using encoding::char_;
103 phx::function<AppendUtf8Action> appendUtf8;
106 phx::function<AppendEscapeSequenceAction> appendEscape;
109 phx::function<EncodeSurrogatePairAction> encodeSurrogatePair;
141 >> eps[insertNode(_val, _a)];
202 >> -(lit(
':') >> -
m_indexRule[at_c<2>(_val) = _1]);
300 m_literalCharRule = char_(U
'\x00', U
'\x5B')
301 | char_(U
'\x5D', U
'\x5F')
302 | char_(U
'\x61', U
'\U0010FFFF')
308 | (char_(U
'\\') >> & (!lit(
'`')));
319 | char_(U
'\x20', U
'\x26')
320 | char_(U
'\x28', U
'\x5B')
321 | char_(U
'\x5D', U
'\U0010FFFF'));
325 (char_(U
'\x07', U
'\x0D')
326 | char_(U
'\x20', U
'\U0010FFFF'));
336 = lexeme[ ((char_(U
'\x41', U
'\x5A')
337 | char_(U
'\x61', U
'\x7A')
338 | char_(U
'\x5F'))[appendUtf8(_val, _1)]
339 >> *(char_(U
'\x30', U
'\x39')
340 | char_(U
'\x41', U
'\x5A')
342 | char_(U
'\x61', U
'\x7A'))[appendUtf8(_val, _1)]) ];
355 | char_(U
'\x23', U
'\x5B')
356 | char_(U
'\x5D', U
'\U0010FFFF');
380 [_pass = (_1 >= 0xD800 && _1 <= 0xDBFF),
381 _val = encodeSurrogatePair(_1, _2)] ];
386 >> int_parser<UnicodeChar, 16, 4, 4>() ];
403 qi::locals<ast::ExpressionNode>,
468 std::vector<ast::FunctionExpressionNode::ArgumentType>(),
The NodeInsertCondition class is a functor that will either yield a true or false result based on whe...
Definition: nodeinsertcondition.h:41
qi::rule< Iterator, ast::IdentifierNode(), Skipper > m_identifierRule
Definition: grammar.h:476
The ComparatorExpressionNode class represents a JMESPath comparator expression.
Definition: comparatorexpressionnode.h:39
The ListWildcardNode class represents a JMESPath list wildcard expression.
Definition: listwildcardnode.h:38
qi::rule< Iterator, ast::ExpressionNode(), Skipper > m_topLevelExpressionRule
Definition: grammar.h:400
qi::rule< Iterator, UnicodeChar()> m_escapedCharRule
Definition: grammar.h:489
qi::rule< Iterator, ast::ParenExpressionNode(), Skipper > m_parenExpressionRule
Definition: grammar.h:463
qi::rule< Iterator, ast::PipeExpressionNode(ast::ExpressionNode &), Skipper > m_pipeExpressionRule
Definition: grammar.h:449
qi::rule< Iterator, ast::CurrentNode()> m_currentNodeRule
Definition: grammar.h:479
qi::rule< Iterator, ast::SliceExpressionNode(), Skipper > m_sliceExpressionRule
Definition: grammar.h:431
qi::rule< Iterator, ast::FilterExpressionNode(), Skipper > m_filterExpressionRule
Definition: grammar.h:428
The HashWildcardNode class represents a JMESPath hash wildcard expression.
Definition: hashwildcardnode.h:38
The BracketSpecifierNode class represents a JMESPath bracket specifier.
Definition: bracketspecifiernode.h:44
qi::rule< Iterator, ast::ArrayItemNode(), Skipper > m_arrayItemRule
Definition: grammar.h:422
qi::rule< Iterator, ast::ComparatorExpressionNode(ast::ExpressionNode &), Skipper > m_comparatorExpressionRule
Definition: grammar.h:452
qi::rule< Iterator, UnicodeChar()> m_unicodeCharRule
Definition: grammar.h:490
qi::rule< Iterator, ast::ListWildcardNode(), Skipper > m_listWildcardRule
Definition: grammar.h:434
qi::rule< Iterator, ast::OrExpressionNode(ast::ExpressionNode &), Skipper > m_orExpressionRule
Definition: grammar.h:457
The AndExpressionNode class represents a JMESPath and expression.
Definition: andexpressionnode.h:38
boost::variant< boost::blank, boost::recursive_wrapper< ExpressionNode >, boost::recursive_wrapper< ExpressionArgumentNode > > ArgumentType
Definition: functionexpressionnode.h:50
qi::rule< Iterator, ast::ExpressionArgumentNode(), Skipper > m_expressionArgumentRule
Definition: grammar.h:475
qi::rule< Iterator, String()> m_quotedStringRule
Definition: grammar.h:486
qi::rule< Iterator, UnicodeChar()> m_literalCharRule
Definition: grammar.h:480
The SliceExpressionNode class represents a JMESPath slice expression.
Definition: sliceexpressionnode.h:41
The NodeInsertPolicy class is a functor for inserting a given node into the AST.
Definition: nodeinsertpolicy.h:38
qi::rule< Iterator, ast::FunctionExpressionNode::ArgumentType(), Skipper > m_functionArgumentRule
Definition: grammar.h:472
The MultiselectHashNode class represents a JMESPath multiselect hash expression.
Definition: multiselecthashnode.h:45
The PipeExpressionNode class represents a JMESPath pipe expression.
Definition: pipeexpressionnode.h:38
qi::rule< Iterator, ast::AndExpressionNode(ast::ExpressionNode &), Skipper > m_andExpressionRule
Definition: grammar.h:460
qi::rule< Iterator, ast::HashWildcardNode(ast::ExpressionNode &), Skipper > m_hashWildcardSubexpressionRule
Definition: grammar.h:416
The Grammar class contains the PEG rule definition based on the EBNF specifications of JMESPath...
Definition: grammar.h:63
qi::rule< Iterator, ast::LiteralNode(), Skipper > m_literalRule
Definition: grammar.h:478
qi::rule< Iterator, ast::IndexExpressionNode(ast::ExpressionNode &), Skipper > m_indexExpressionRule
Definition: grammar.h:410
The SubexpressionNode class represents a JMESPath subexpression.
Definition: subexpressionnode.h:37
The ExpressionArgumentNode class represents a JMESPath expression argument.
Definition: expressionargumentnode.h:40
The InsertNodeAction class is a functor for inserting the given node into the AST whose root node is ...
Definition: insertnodeaction.h:59
qi::rule< Iterator, ast::FlattenOperatorNode(), Skipper > m_flattenOperatorRule
Definition: grammar.h:425
qi::rule< Iterator > m_escapeRule
Definition: grammar.h:493
qi::rule< Iterator, ast::NotExpressionNode(ast::ExpressionNode &), Skipper > m_notExpressionRule
Definition: grammar.h:446
qi::rule< Iterator, ast::MultiselectHashNode::KeyValuePairType(), Skipper > m_keyValuePairRule
Definition: grammar.h:443
qi::rule< Iterator, ast::ExpressionNode(), qi::locals< ast::ExpressionNode >, Skipper > m_expressionRule
Definition: grammar.h:404
qi::rule< Iterator, ast::MultiselectHashNode(), Skipper > m_multiselectHashRule
Definition: grammar.h:440
qi::rule< Iterator, String()> m_unquotedStringRule
Definition: grammar.h:487
qi::rule< Iterator, UnicodeChar()> m_unescapedCharRule
Definition: grammar.h:488
The FilterExpressionNode class represents a JMESPath filter expression.
Definition: filterexpressionnode.h:39
qi::rule< Iterator, ast::HashWildcardNode(ast::ExpressionNode &), Skipper > m_hashWildcardRule
Definition: grammar.h:413
qi::rule< Iterator, ast::RawStringNode(), Skipper > m_rawStringRule
Definition: grammar.h:477
qi::rule< Iterator, std::pair< UnicodeChar, UnicodeChar >)> m_rawStringEscapeRule
Definition: grammar.h:485
Comparator
The Comparator enum defines the available comparison operators.
Definition: comparatorexpressionnode.h:45
The OrExpressionNode class represents a JMESPath or expression.
Definition: orexpressionnode.h:38
qi::rule< Iterator, Index()> m_indexRule
Definition: grammar.h:495
qi::rule< Iterator, ast::BracketSpecifierNode(), Skipper > m_bracketSpecifierRule
Definition: grammar.h:419
Grammar()
Constructs a Grammar object.
Definition: grammar.h:71
The IndexExpressionNode class represents a JMESPath index expression.
Definition: indexexpressionnode.h:39
qi::symbols< UnicodeChar, UnicodeChar > m_controlCharacterSymbols
Definition: grammar.h:494
The NotExpressionNode class represents a JMESPath not expression.
Definition: notexpressionnode.h:39
qi::rule< Iterator, ast::FunctionExpressionNode(), Skipper > m_functionExpressionRule
Definition: grammar.h:466
qi::rule< Iterator, UnicodeChar()> m_rawStringCharRule
Definition: grammar.h:482
The ArrayItemNode class represents a JMESPath array index expression.
Definition: arrayitemnode.h:40
The FlattenOperatorNode class represents a JMESPath flatten operator.
Definition: flattenoperatornode.h:39
The MultiselectListNode class represents a JMESPath list wildcard expression.
Definition: multiselectlistnode.h:42
The ExpressionNode class represents a JMESPath expression.
Definition: expressionnode.h:56
std::pair< IdentifierNode, ExpressionNode > KeyValuePairType
Definition: multiselecthashnode.h:48
qi::symbols< UnicodeChar, ast::ComparatorExpressionNode::Comparator > m_comparatorSymbols
Definition: grammar.h:454
qi::rule< Iterator, UnicodeChar()> m_literalEscapeRule
Definition: grammar.h:481
qi::rule< Iterator, UnicodeChar()> m_surrogatePairCharacterRule
Definition: grammar.h:491
qi::rule< Iterator, std::vector< ast::FunctionExpressionNode::ArgumentType >), Skipper > m_functionArgumentListRule
Definition: grammar.h:469
qi::rule< Iterator > m_quoteRule
Definition: grammar.h:492
qi::rule< Iterator, ast::MultiselectListNode(), Skipper > m_multiselectListRule
Definition: grammar.h:437
The ParenExpressionNode class represents a JMESPath paren expression.
Definition: parenexpressionnode.h:38
char32_t UnicodeChar
32 bit character type
Definition: types.h:48
qi::rule< Iterator, ast::SubexpressionNode(ast::ExpressionNode &), Skipper > m_subexpressionRule
Definition: grammar.h:407
The FunctionExpressionNode class represents a JMESPath function expression.
Definition: functionexpressionnode.h:45