#1985 Curve Calculator : Simplify interface to expression parser

This commit is contained in:
Magne Sjaastad
2017-10-12 10:52:25 +02:00
parent 650e29d6d5
commit 445048c24b
5 changed files with 17 additions and 45 deletions

View File

@@ -25,9 +25,7 @@ TEST(RicExpressionParserTest, BasicUsage)
parser.assignVector("c", c);
QString expr = "c := a + b";
parser.setExpression(expr);
EXPECT_TRUE(parser.evaluate());
EXPECT_TRUE(parser.evaluate(expr));
EXPECT_DOUBLE_EQ(c[0], 110.0);
EXPECT_DOUBLE_EQ(c[9], 128.0);

View File

@@ -36,14 +36,6 @@ ExpressionParser::~ExpressionParser()
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void ExpressionParser::setExpression(const QString& expression)
{
m_expressionParserImpl->setExpression(expression);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -63,15 +55,7 @@ void ExpressionParser::assignVector(const QString& variableName, std::vector<dou
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool ExpressionParser::evaluate()
bool ExpressionParser::evaluate(const QString& expressionText, QString* errorText)
{
return m_expressionParserImpl->evaluate();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString ExpressionParser::errorText()
{
return m_expressionParserImpl->errorText();
return m_expressionParserImpl->evaluate(expressionText, errorText);
}

View File

@@ -36,10 +36,8 @@ public:
static std::vector<QString> detectReferencedVariables(const QString& expression);
void setExpression(const QString& expression);
void assignVector(const QString& variableName, std::vector<double>& vector);
bool evaluate();
QString errorText();
bool evaluate(const QString& expressionText, QString* errorText = nullptr);
private:
std::unique_ptr<ExpressionParserImpl> m_expressionParserImpl;

View File

@@ -26,14 +26,6 @@ ExpressionParserImpl::ExpressionParserImpl()
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void ExpressionParserImpl::setExpression(const QString& expression)
{
m_expression = expression;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -64,13 +56,14 @@ void ExpressionParserImpl::assignVector(const QString& variableName, std::vector
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool ExpressionParserImpl::evaluate()
bool ExpressionParserImpl::evaluate(const QString& expressionText, QString* errorText)
{
expression_t expression;
expression.register_symbol_table(m_symbol_table);
if (!parser.compile(m_expression.toStdString(), expression))
parser_t parser;
if (!parser.compile(expressionText.toStdString(), expression))
{
return false;
}
@@ -78,13 +71,18 @@ bool ExpressionParserImpl::evaluate()
// Trigger evaluation
expression.value();
if (errorText)
{
*errorText = parserErrorText(parser);
}
return (parser.error_count() == 0);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString ExpressionParserImpl::errorText() const
QString ExpressionParserImpl::parserErrorText(parser_t& parser)
{
QString txt;

View File

@@ -34,20 +34,14 @@ class ExpressionParserImpl
public:
ExpressionParserImpl();
void setExpression(const QString& expression);
static std::vector<QString> detectReferencedVariables(const QString& expression);
void assignVector(const QString& variableName, std::vector<double>& vector);
bool evaluate();
QString errorText() const;
void assignVector(const QString& variableName, std::vector<double>& vector);
bool evaluate(const QString& expressionText, QString* errorText = nullptr);
private:
QString m_expression;
QString parserErrorText(parser_t& parser);
private:
symbol_table_t m_symbol_table;
expression_t expression;
mutable parser_t parser;
};