Parses and executes expressions in the FEEL Language, as defined by the OMG: Decision Model and Notation
FEEL is the "Friendly Enough Expression Language".
The goal of this project is to:
- Parse FEEL expressions that conform to version 1.3 of the DMN Specification.
- Execute FEEL expressions and return the result.
- Support all FEEL data types.
- Support all special properties (such as the date and time properties).
- Support all FEEL Built-in functions. (Approximately 80 functions).
- Provide a FEEL library for embedded use in Rust applications.
- Provide a REST API service with rule caching to serve as a simple Rules Engine.
- Enable storage of precompiled rules in Redis.
- Support simple rule chaining, where one rule may execute another.
- Support State Machines, where rules are handed the starting state and create and return the resulting state.
- Support Decision Tables
The current state of progress:
- All FEEL data types are implemented.
- Date and DateTime data types do not support Time zones.
- All standard library functions have been implemented.
- All special date, time and duration properties have been implemented.
- Contexts and nested contexts are functional.
- The syntax recognizer (built using the PEST parser generator, with a PEG grammar) can recognize most features. It is based on a grammar for an earlier version of FEEL, hence is missing a few features, like time and date literals. These will be added eventually.
- Most of the OpCodes for the Virtual machine are implemented.
- Code generation macros have been written for if-then-else expressions.
- Code generation macros have been written for nested-for loops over ranges and lists.
- Code generation macros have been written for "every" and "some" list folding statements.
- Code generation for user defined functions has not been written.
- Compiled expressions may be executed on the VM.
- The parser is now hooked up to the code generator!!!. It is incomplete.
- Some expressions may be parsed, compiled, and executed, including:
- Create literals (nulls, numbers, booleans, strings, names, and ranges are complete)
- Create lists
- Arithmetic operators (+ - * / **)
- Logical Operators (and or not)
- Relational Operators (< <= = != > >=)
- in operator (for ranges and lists)
- path expressions (a.b.c.d chains of context lookups)
- calling builtin functions
- Remaining code compilation and code generation features that are in progress:
- Remaining literals (date, time, date time, durations)
- for-loops
- every and some loops
- user defined functions
- special property lookups
- list filtering
- context filtering
- calling functions using named parameters
- instance of operator
- automatic promotion of scalars to lists
- sorting
- etc.