24 #include <boost/algorithm/string.hpp>
55 throw cms::Exception(
"FailModule") <<
"\nError in parsing the logical expression = " << logicalExpressionVal
74 throw cms::Exception(
"FailModule") <<
"\nError in parsing the logical expression = " << logicalExpressionVal
83 logicalExpressionVal = logicalExpressionBS;
97 throw cms::Exception(
"FailModule") <<
"\nError in parsing the logical expression = " << logicalExpressionVal
103 throw cms::Exception(
"FileModule") <<
"\nError in parsing the numerical expression = " << numericalExpressionVal
115 throw cms::Exception(
"FileModule") <<
"\nError in building RPN vector for the logical expression = "
116 << logicalExpressionVal << std::endl;
145 LogDebug(
"L1GtLogicParser") <<
"\nL1GtLogicParser::checkLogicalExpression - "
146 <<
"\nInitial logical expression = '" << logicalExpressionVal <<
"'"
147 <<
"\nFinal logical expression = '" << logicalExpressionBS <<
"'\n"
150 logicalExpressionVal = logicalExpressionBS;
176 std::stack<TokenRPN> operatorStack;
178 static const std::string whitespaces =
" \r\v\n\t";
184 std::istringstream exprStringStream(logicalExpressionVal);
186 while (!exprStringStream.eof()) {
187 exprStringStream >> std::skipws >> std::ws >> tokenString;
190 if (tokenString.find_first_not_of(whitespaces) == std::string::npos || tokenString.length() == 0) {
198 actualOperation =
getOperation(tokenString, lastOperation, rpnToken);
207 switch (actualOperation) {
215 int errorPosition = exprStringStream.tellg();
217 edm::LogError(
"L1GtLogicParser") <<
"\nLogical expression = '" << logicalExpressionVal <<
"'"
218 <<
"\n Syntax error during parsing: "
219 <<
"\n " << exprStringStream.str().substr(0, errorPosition) <<
"\n "
220 << exprStringStream.str().substr(errorPosition)
221 <<
"\n Returned empty RPN vector and result false." << std::endl;
231 operatorStack.push(rpnToken);
238 while (!operatorStack.empty() && operatorStack.top().operation ==
OP_NOT) {
242 operatorStack.push(rpnToken);
248 while (!operatorStack.empty() &&
249 (operatorStack.top().operation ==
OP_NOT || operatorStack.top().operation ==
OP_AND)) {
254 operatorStack.push(rpnToken);
260 operatorStack.push(rpnToken);
266 if (operatorStack.empty()) {
267 int errorPosition = exprStringStream.tellg();
269 edm::LogError(
"L1GtLogicParser") <<
"\nLogical expression = '" << logicalExpressionVal <<
"'"
270 <<
"\n Syntax error during parsing - misplaced ')':"
271 <<
"\n " << exprStringStream.str().substr(0, errorPosition) <<
"\n "
272 << exprStringStream.str().substr(errorPosition)
273 <<
"\n Returned empty RPN vector and result false." << std::endl;
287 if (operatorStack.empty()) {
289 int errorPosition = exprStringStream.tellg();
291 edm::LogError(
"L1GtLogicParser") <<
"\nLogical expression = '" << logicalExpressionVal <<
"'"
292 <<
"\n Syntax error during parsing - misplaced ')':"
293 <<
"\n " << exprStringStream.str().substr(0, errorPosition)
294 <<
"\n " << exprStringStream.str().substr(errorPosition)
295 <<
"\n Returned empty RPN vector and result false." << std::endl;
312 lastOperation = actualOperation;
316 while (!operatorStack.empty()) {
318 edm::LogError(
"L1GtLogicParser") <<
"\nLogical expression = '" << logicalExpressionVal <<
"'"
319 <<
"\n Syntax error during parsing - missing ')':"
320 <<
"\n Returned empty RPN vector and result false." << std::endl;
336 if (it->operation ==
OP_OR || it->operation ==
OP_AND)
339 edm::LogError(
"L1GtLogicParser") <<
"\nLogical expression = '" << logicalExpressionVal <<
"'"
340 <<
"\n Syntax error during parsing - too many operators"
341 <<
"\n Returned empty RPN vector and result false." << std::endl;
350 edm::LogError(
"L1GtLogicParser") <<
"\nLogical expression = '" << logicalExpressionVal <<
"'"
351 <<
"\n Syntax error during parsing - too many operands"
352 <<
"\n Returned empty RPN vector and result false." << std::endl;
384 switch (it->operation) {
438 while (!exprStringStream.eof()) {
439 exprStringStream >> tokenString;
445 actualOperation =
getOperation(tokenString, lastOperation, rpnToken);
449 <<
"\n Invalid operation/operand " << operandNameVal
450 <<
"\n Returned index is by default out of range (-1)." << std::endl;
460 if (rpnToken.
operand == operandNameVal) {
472 lastOperation = actualOperation;
477 <<
"\n Operand " << operandNameVal <<
" not found in the logical expression"
478 <<
"\n Returned index is by default out of range (-1)." << std::endl;
499 while (!exprStringStream.eof()) {
500 exprStringStream >> tokenString;
506 actualOperation =
getOperation(tokenString, lastOperation, rpnToken);
510 <<
"\n Invalid operation/operand at position " << iOperand
511 <<
"\n Returned empty name by default." << std::endl;
521 if (tmpIndex == iOperand) {
533 lastOperation = actualOperation;
538 <<
"\n No operand found at position " << iOperand
539 <<
"\n Returned empty name by default." << std::endl;
554 edm::LogError(
"L1GtLogicParser") <<
"\n Operand " << operandNameVal <<
" not found in the operand token vector"
555 <<
"\n Returned false by default." << std::endl;
570 edm::LogError(
"L1GtLogicParser") <<
"\n No operand with token number " << tokenNumberVal
571 <<
" found in the operand token vector"
572 <<
"\n Returned false by default." << std::endl;
586 edm::LogError(
"L1GtLogicParser") <<
"\n No built RPN vector exists."
587 <<
"\n Returned false by default." << std::endl;
592 std::stack<bool> resultStack;
601 switch (it->operation) {
608 b1 = resultStack.top();
610 resultStack.push(!
b1);
615 b1 = resultStack.top();
617 b2 = resultStack.top();
619 resultStack.push(
b1 ||
b2);
624 b1 = resultStack.top();
626 b2 = resultStack.top();
628 resultStack.push(
b1 &&
b2);
647 return resultStack.top();
682 while (!exprStringStream.eof()) {
683 exprStringStream >> tokenString;
689 actualOperation =
getOperation(tokenString, lastOperation, rpnToken);
693 <<
"\n Invalid operation/operand at position " << iOperand
694 <<
"\n Returned false by default." << std::endl;
705 if (tmpIndex == iOperand) {
715 <<
"\n Invalid result for operand at position " << iOperand <<
": "
716 << rpnToken.
operand <<
"\n It must be 0 or 1"
717 <<
"\n Returned false by default." << std::endl;
734 lastOperation = actualOperation;
739 <<
"\n No operand found at position " << iOperand
740 <<
"\n Returned false by default." << std::endl;
764 switch (it->operation) {
810 edm::LogError(
"L1GtLogicParser") <<
"\n No built RPN vector exists."
811 <<
"\n Returned false by default." << std::endl;
816 std::stack<bool> resultStack;
825 switch (it->operation) {
832 b1 = resultStack.top();
834 resultStack.push(!
b1);
839 b1 = resultStack.top();
841 b2 = resultStack.top();
843 resultStack.push(
b1 ||
b2);
848 b1 = resultStack.top();
850 b2 = resultStack.top();
852 resultStack.push(
b1 &&
b2);
873 return resultStack.top();
899 while (!exprStringStream.eof()) {
900 exprStringStream >> tokenString;
902 actualOperation =
getOperation(tokenString, lastOperation, rpnToken);
906 <<
"\n Invalid operation/operand in logical expression."
907 <<
"\n Return empty logical expression." << std::endl;
914 convertedLogicalExpression.append(
getRuleFromType(actualOperation)->opString);
917 typedef std::map<std::string, int>::const_iterator CIter;
919 CIter it = nameToIntMap.find(rpnToken.
operand);
920 if (it != nameToIntMap.end()) {
922 std::stringstream intStr;
924 convertedLogicalExpression.append(intStr.str());
929 <<
"\n Could not convert " << rpnToken.
operand <<
" to integer!"
930 <<
"\n Return empty logical expression." << std::endl;
937 convertedLogicalExpression.append(
" ");
938 lastOperation = actualOperation;
945 LogDebug(
"L1GtLogicParser") <<
"\nL1GtLogicParser::convertNameToIntLogicalExpression - "
947 <<
"\nLogical expression (int) = '" << convertedLogicalExpression <<
"'\n"
978 while (!exprStringStream.eof()) {
979 exprStringStream >> tokenString;
981 actualOperation =
getOperation(tokenString, lastOperation, rpnToken);
985 <<
"\n Invalid operation/operand in logical expression."
986 <<
"\n Return empty logical expression." << std::endl;
993 convertedLogicalExpression.append(
getRuleFromType(actualOperation)->opString);
996 typedef std::map<int, std::string>::const_iterator CIter;
1000 std::istringstream iss(rpnToken.
operand);
1003 CIter it = intToNameMap.find(indexInt);
1004 if (it != intToNameMap.end()) {
1005 convertedLogicalExpression.append(it->second);
1010 <<
"\n Could not convert " << rpnToken.
operand <<
" to string!"
1011 <<
"\n Return empty logical expression." << std::endl;
1018 convertedLogicalExpression.append(
" ");
1019 lastOperation = actualOperation;
1051 std::vector<OperandToken> opVector;
1055 std::stack<OperandToken> tmpStack;
1056 std::vector<OperandToken> tmpVector;
1061 bool newOperandBlock =
true;
1062 bool oneBlockOnly =
true;
1063 bool operandOnly =
true;
1078 switch (it->operation) {
1084 if ((!newOperandBlock)) {
1085 for (std::vector<OperandToken>::reverse_iterator itOp = tmpVector.rbegin(); itOp != tmpVector.rend();
1087 opVector.push_back(*itOp);
1097 newOperandBlock =
true;
1098 oneBlockOnly =
false;
1113 newOperandBlock =
false;
1114 operandOnly =
false;
1116 b1 = tmpStack.top();
1119 tmpStack.push(dummyToken);
1131 newOperandBlock =
false;
1132 operandOnly =
false;
1134 b1 = tmpStack.top();
1136 b2 = tmpStack.top();
1139 tmpStack.push(dummyToken);
1141 if (
b1.tokenNumber >= 0) {
1142 tmpVector.push_back(
b1);
1150 if (
b2.tokenNumber >= 0) {
1151 tmpVector.push_back(
b2);
1163 newOperandBlock =
false;
1164 operandOnly =
false;
1166 b1 = tmpStack.top();
1168 b2 = tmpStack.top();
1171 tmpStack.push(dummyToken);
1173 if (
b1.tokenNumber >= 0) {
1174 tmpVector.push_back(
b1);
1182 if (
b2.tokenNumber >= 0) {
1183 tmpVector.push_back(
b2);
1203 if (oneBlockOnly || operandOnly) {
1207 b1 = tmpStack.top();
1208 tmpVector.push_back(
b1);
1212 for (std::vector<OperandToken>::reverse_iterator itOp = tmpVector.rbegin(); itOp != tmpVector.rend(); itOp++) {
1213 opVector.push_back(*itOp);
1225 for (std::vector<OperandToken>::reverse_iterator itOp = tmpVector.rbegin(); itOp != tmpVector.rend(); itOp++) {
1226 opVector.push_back(*itOp);
1237 std::vector<OperandToken> opVectorU;
1238 opVectorU.reserve(opVector.size());
1240 for (std::vector<OperandToken>::const_iterator constIt = opVector.begin(); constIt != opVector.end(); constIt++) {
1241 bool tokenIncluded =
false;
1243 for (std::vector<OperandToken>::iterator itOpU = opVectorU.begin(); itOpU != opVectorU.end(); itOpU++) {
1244 if ((*itOpU).tokenName == (*constIt).tokenName) {
1245 tokenIncluded =
true;
1250 if (!tokenIncluded) {
1251 opVectorU.push_back(*constIt);
1293 rpnToken.
operand = tokenString;
1302 return actualOperation;
1333 dstExpression = srcExpression;
1338 if (((
position + 1) != std::string::npos) && (dstExpression[
position + 1] !=
' ')) {
1339 dstExpression.insert(
position + 1,
" ");
1344 dstExpression.insert(
position,
" ");