Skip to content

casbin-cpp/Cvaluate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Cvaluate

Provides support for evaluating arbitrary C-like artithmetic/string expressions like govaluate.

Development Target

  • Support basic math expression, example "1 + 1 == 2".
  • Support variable in expression, example "a + 1 == 2".
  • Support Accessors, example "a.b == 1".
  • Support Functions in expression, example "foo(a, b)".

Development Plan

  • Parse expression and get tokens.

    • Parse expression.
    • Check tokens syntax and check balance.
    • Test parse tokens.
  • Build expression tree by tokens.

    • Support baisc numeric add expression 1 + 49.
    • Design expression tree like evaluationStage.
    • Test expression tree.
  • Support basic math expression.

    • Support +-*/.
    • Support compare operator.
    • If two operator have same prority, like "1 + 101 % 2 * 5". Because 2 * 5 is in the right stage of operator %, so it will calculate 2 * 5 first. In this case, we will get wrong answer 2 rather than 6. This issue can be fixed by reorderStages.
    • Support bit shift.
  • Support variable and accessors.

    • Support Eval(params), params is a map like name: object in gvaluate .
    • Basic data type of params is int ,float, string. Use json as base data type.
    • Support simple field accessor using json.
    • Object data of params should reload operator[] and operator for access and compare. Maybe we can accomplish it by define a base object or use template to support accessors.
  • Add benchmark for Cvaluate.

  • Performance enhancement.

Install Cvaluate

  1. Download this repository git clone https://github.com/casbin-cpp/Cvaluate.

  2. Make a directory to complie mkdir build && cd build.

  3. Prepare build file cmake -DCMAKE_BUILD_TYPE=Release ...

  4. Build and install make install.

Usage

void test_cvaluate() {
    using namespace std;
    string s = "1 + 2 > 1.3";
    auto expression = Cvaluate::EvaluableExpression(s);

    cout << expression.Evaluate({}) << endl;    // output true
}