Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <sstream>
00016
00017 #include "Reflex/Object.h"
00018
00019
00020 #include "Fireworks/Core/interface/FWExpressionEvaluator.h"
00021 #include "Fireworks/Core/interface/FWExpressionException.h"
00022 #include "CommonTools/Utils/src/Grammar.h"
00023 #include "CommonTools/Utils/interface/Exception.h"
00024
00025 #include "Fireworks/Core/src/expressionFormatHelpers.h"
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 FWExpressionEvaluator::FWExpressionEvaluator(const std::string& iExpression,
00039 const std::string& iClassName) :
00040 m_className(iClassName),
00041 m_type(Reflex::Type::ByName(iClassName))
00042 {
00043 setExpression(iExpression);
00044 }
00045
00046
00047
00048
00049
00050
00051 FWExpressionEvaluator::~FWExpressionEvaluator()
00052 {
00053 }
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 void
00071 FWExpressionEvaluator::setExpression(const std::string& iExpression)
00072 {
00073 if(m_type != Reflex::Type() && iExpression.size()) {
00074 using namespace fireworks::expression;
00075
00076
00077 std::string temp = oldToNewFormat(iExpression);
00078
00079
00080 using namespace boost::spirit::classic;
00081 reco::parser::ExpressionPtr tmpPtr;
00082 reco::parser::Grammar grammar(tmpPtr,m_type);
00083 try {
00084 if(parse(temp.c_str(), grammar.use_parser<1>() >> end_p, space_p).full) {
00085 m_expr = tmpPtr;
00086 m_expression = iExpression;
00087 } else {
00088 throw FWExpressionException("syntax error", -1);
00089
00090 }
00091 } catch(const reco::parser::BaseException& e) {
00092
00093 throw FWExpressionException(reco::parser::baseExceptionWhat(e), indexFromNewFormatToOldFormat(temp,e.where-temp.c_str(),iExpression));
00094
00095 }
00096 } else {
00097 m_expression=iExpression;
00098 }
00099 }
00100
00101 void
00102 FWExpressionEvaluator::setClassName(const std::string& iClassName)
00103 {
00104
00105
00106
00107
00108 m_className = iClassName;
00109 m_type = Reflex::Type::ByName(iClassName);
00110 setExpression(m_expression);
00111 }
00112
00113
00114
00115
00116 const std::string&
00117 FWExpressionEvaluator::expression() const
00118 {
00119 return m_expression;
00120 }
00121
00122 double
00123 FWExpressionEvaluator::evalExpression(const void* iObject) const
00124 {
00125 if(m_expression.empty() || !m_expr.get()) {
00126 return 0;
00127 }
00128
00129 Reflex::Object o(m_type, const_cast<void *>(iObject));
00130 return m_expr->value(o);
00131 }
00132
00133
00134
00135