"not" return isc::eval::EvalParser::make_NOT(loc);
"and" return isc::eval::EvalParser::make_AND(loc);
"or" return isc::eval::EvalParser::make_OR(loc);
+"member" return isc::eval::EvalParser::make_MEMBER(loc);
"." return isc::eval::EvalParser::make_DOT(loc);
"(" return isc::eval::EvalParser::make_LPAREN(loc);
")" return isc::eval::EvalParser::make_RPAREN(loc);
OPTION "option"
RELAY4 "relay4"
RELAY6 "relay6"
+ MEMBER "member"
PEERADDR "peeraddr"
LINKADDR "linkaddr"
LBRACKET "["
TokenPtr exist(new TokenVendor(ctx.getUniverse(), $3, TokenOption::EXISTS, $8));
ctx.expression.push_back(exist);
}
+ | MEMBER "(" STRING ")"
+ {
+ // Expression member('foo')
+ //
+ // This token will check if the packet is a member of
+ // the specified client class.
+ // To avoid loops at evaluation only already known and
+ // built-in classes are allowed.
+ std::string cc = $3;
+ if (!ctx.isClientClassKnown(cc)) {
+ error(@3, "Unknown client class '" + cc + "'");
+ }
+ TokenPtr member(new TokenMember(cc));
+ ctx.expression.push_back(member)
+ }
;
string_expr : STRING