ATLAS Offline Software
Loading...
Searching...
No Matches
ExpressionParsing::ExpressionParser Class Reference

#include <ExpressionParser.h>

Collaboration diagram for ExpressionParsing::ExpressionParser:

Public Member Functions

 ExpressionParser ()
 ExpressionParser (IProxyLoader *proxyLoader)
 ExpressionParser (IUnitInterpreter *unitInterpreter)
 ExpressionParser (IProxyLoader *proxyLoader, IUnitInterpreter *unitInterpreter)
 ~ExpressionParser ()
 ExpressionParser (const ExpressionParser &)=delete
ExpressionParseroperator= (const ExpressionParser &)=delete
bool loadExpression (const std::string &expression)
StackElement evaluate () const
StackElement evaluate (const EventContext &ctx) const
bool evaluateAsBool () const
double evaluateAsDouble () const
std::vector< int > evaluateAsVector () const
std::vector< std::string > getVariables () const

Private Member Functions

void setup ()

Private Attributes

IProxyLoaderm_proxyLoader
IUnitInterpreterm_unitInterpreter
std::vector< StackElementm_code
VirtualMachine * m_vm

Detailed Description

Definition at line 29 of file ExpressionParser.h.

Constructor & Destructor Documentation

◆ ExpressionParser() [1/5]

◆ ExpressionParser() [2/5]

ExpressionParsing::ExpressionParser::ExpressionParser ( IProxyLoader * proxyLoader)

Definition at line 27 of file ExpressionParser.cxx.

◆ ExpressionParser() [3/5]

ExpressionParsing::ExpressionParser::ExpressionParser ( IUnitInterpreter * unitInterpreter)

Definition at line 34 of file ExpressionParser.cxx.

35 {
37 m_unitInterpreter = unitInterpreter;
38 setup();
39 }

◆ ExpressionParser() [4/5]

ExpressionParsing::ExpressionParser::ExpressionParser ( IProxyLoader * proxyLoader,
IUnitInterpreter * unitInterpreter )

Definition at line 41 of file ExpressionParser.cxx.

42 {
43 m_proxyLoader = proxyLoader;
44 m_unitInterpreter = unitInterpreter;
45 setup();
46 }

◆ ~ExpressionParser()

ExpressionParsing::ExpressionParser::~ExpressionParser ( )

Definition at line 48 of file ExpressionParser.cxx.

49 {
50 if (m_vm) {
51 delete m_vm;
52 }
53 }

◆ ExpressionParser() [5/5]

ExpressionParsing::ExpressionParser::ExpressionParser ( const ExpressionParser & )
delete

Member Function Documentation

◆ evaluate() [1/2]

StackElement ExpressionParsing::ExpressionParser::evaluate ( ) const

Definition at line 103 of file ExpressionParser.cxx.

104 {
105 const EventContext& ctx = Gaudi::Hive::currentContext();
106 return m_vm->execute(ctx, m_code);
107 }
std::vector< StackElement > m_code

◆ evaluate() [2/2]

StackElement ExpressionParsing::ExpressionParser::evaluate ( const EventContext & ctx) const

Definition at line 98 of file ExpressionParser.cxx.

99 {
100 return m_vm->execute(ctx, m_code);
101 }

◆ evaluateAsBool()

bool ExpressionParsing::ExpressionParser::evaluateAsBool ( ) const

Definition at line 109 of file ExpressionParser.cxx.

110 {
111 StackElement result = evaluate();
112 if (result.isScalar()) return result.asBool();
113 else throw std::runtime_error("Unable to evaluate vector quantity as a boolean");
114 }

◆ evaluateAsDouble()

double ExpressionParsing::ExpressionParser::evaluateAsDouble ( ) const

Definition at line 116 of file ExpressionParser.cxx.

117 {
118 StackElement result = evaluate();
119 if (result.isScalar()) return result.scalarValue<double>();
120 else throw std::runtime_error("Unable to evaluate vector quantity as a double");
121 }

◆ evaluateAsVector()

std::vector< int > ExpressionParsing::ExpressionParser::evaluateAsVector ( ) const

Definition at line 123 of file ExpressionParser.cxx.

124 {
125 StackElement result = evaluate();
126 if (result.isVector()) return result.vectorValue<int>();
127 else throw std::runtime_error("Unable to evaluate scalar quantity as a vector");
128 }

◆ getVariables()

std::vector< std::string > ExpressionParsing::ExpressionParser::getVariables ( ) const

Definition at line 88 of file ExpressionParser.cxx.

88 {
89 std::vector<std::string> vars;
90 for (const StackElement &element : m_code) {
91 if (element.isProxy() && std::find(vars.begin(),vars.end(),element.proxyVarName()) == vars.end() ) {
92 vars.push_back( element.proxyVarName() );
93 }
94 }
95 return vars;
96 }

◆ loadExpression()

bool ExpressionParsing::ExpressionParser::loadExpression ( const std::string & expression)

Definition at line 60 of file ExpressionParser.cxx.

61 {
62 std::string trimmedExpression = boost::algorithm::trim_copy_if(expression, boost::is_any_of("\""));
63
65 m_code.clear();
66
67 Grammar<std::string::const_iterator> grammar;
68 ast::expression expr;
69
70 std::string::const_iterator expressionIter = trimmedExpression.begin();
71 std::string::const_iterator expressionEnd = trimmedExpression.end();
72 using boost::spirit::ascii::space_type;
73 bool r = phrase_parse(expressionIter, expressionEnd, grammar, space_type(), expr);
74 std::string remainingExpression(expressionIter, expressionEnd);
75 boost::trim(remainingExpression);
76 if (remainingExpression.length() > 0) {
77 throw std::runtime_error("Did you forget an operator? This was not parsed: '" + remainingExpression +"'");
78 }
79
80 if (!r) return false;
81
82 Compiler compiler(m_code, m_proxyLoader, m_unitInterpreter);
83 compiler(expr);
84
85 return true;
86 }
int r
Definition globals.cxx:22

◆ operator=()

ExpressionParser & ExpressionParsing::ExpressionParser::operator= ( const ExpressionParser & )
delete

◆ setup()

void ExpressionParsing::ExpressionParser::setup ( )
private

Definition at line 55 of file ExpressionParser.cxx.

56 {
57 m_vm = new VirtualMachine();
58 }

Member Data Documentation

◆ m_code

std::vector<StackElement> ExpressionParsing::ExpressionParser::m_code
private

Definition at line 55 of file ExpressionParser.h.

◆ m_proxyLoader

IProxyLoader* ExpressionParsing::ExpressionParser::m_proxyLoader
private

Definition at line 53 of file ExpressionParser.h.

◆ m_unitInterpreter

IUnitInterpreter* ExpressionParsing::ExpressionParser::m_unitInterpreter
private

Definition at line 54 of file ExpressionParser.h.

◆ m_vm

VirtualMachine* ExpressionParsing::ExpressionParser::m_vm
private

Definition at line 56 of file ExpressionParser.h.


The documentation for this class was generated from the following files: