DMNTK | Decision Model and Notation Toolkit
FEEL grammar and parsing tables generator used in dmntk project.
This crate implements:
FEEL
language in the format acceptable by Bison
parser generator.Rust
language.Excerpt from Decision Model and Notation™ specification, ver. 1.3, pp. 105-179:
"DMN 1.3 defines the friendly enough expression language (FEEL) for the purpose of giving standard executable semantics to many kinds of expressions in decision model. [...] FEEL syntax is defined as a grammar here [...]".
dmntk-feel-grammar crate defines the Bison
version of the full FEEL
grammar
as defined in clause 10.3 of cited above Decision Model and Notation™ specification.
In addition, dmntk-feel-grammar crate provides functionality for generating LALR parsing tables
and reduce actions
, ready to be used by LALR
parser written in Rust.
Such parser that uses the output from dmntk-feel-grammar crate
is implemented in dmntk-feel-parser.
Inputs and outputs of dmntk-feel-grammar crate are depicted in the following diagram:
dmntk-feel-grammar takes Yacc/Bison
compatible grammar file as an input.
Grammar file for FEEL
language is defined as a source file named feel.y
and compiled
with this crate.
The output from dmntk-feel-grammar create is a file named lalr.rs
.
This file is a Rust source code that contains definitions of parsing tables and reduce actions.
dmntk-feel-grammar crate uses Bison parser generator
to process the input grammar file and to generate the parser source for C
language.
Command that generates the parser for C
language using Bison
may look like this:
shell
$ LANG=C bison -l -r states -L C feel.y
Bison
generates C
source file that contains the generated parsing tables.
dmntk-feel-grammar extracts those tables, adds reduce action definitions and saves
the result code in lalr.rs
file as Rust source code.
dmntk-feel-grammar requires:
- installed the newest Rust nightly version,
- installed the newest Bison
version.
dmntk-feel-grammar may be used as a library.
Add dmntk-feel-grammar
to your Cargo.toml
:
toml
[dependencies]
dmntk-feel-grammar = "0.0.40"
To generate LALR parsing tables, call lalr_rust_tables
function:
```rust use dmntkfeelgrammar::lalrrusttables;
fn main() { lalrrusttables("./src/lalr.rs"); } ```
The following grammar rules are taken from Decision Model and Notation™ ver. 1.3
expression =
textual_expression =
(
, expression , )
;textualexpressions = textual expression , { ,
, textualexpression } ;
arithmetic_expression =
simpleexpression = arithmeticexpression | simple_value ;
simpleexpressions = simpleexpression , { ,
, simple_expression } ;
simplepositiveunary_test =
<
| <=
| >
| >=
] , endpoint |interval = ( openintervalstart | closedintervalstart ) ,
endpoint , ..
, endpoint ,
( openintervalend | closedintervalend ) ;
openintervalstart = (
| ]
;
closedintervalstart = [
;
openintervalend = )
| [
;
closedintervalend = ]
;
positiveunarytest = expression ;
positiveunarytests = positiveunarytest , { ,
, positiveunarytest } ;
unary_tests =
not
, (
, positiveunarytests, )
|-
;endpoint = simple_value ;
simplevalue = qualifiedname | simple_literal ;
qualified_name = name , { .
, name } ;
addition = expression , +
, expression ;
subtraction = expression , -
, expression ;
multiplication = expression , *
, expression ;
division = expression , /
, expression ;
exponentiation = expression, **
, expression ;
arithmetic_negation = -
, expression ;
name = namestart , { namepart | additionalnamesymbols } ;
namestart = namestartchar, { namepart_char } ;
namepart = namepartchar , { namepart_char } ;
namestartchar = ?
| [A-Z]
| _
| [a-z]
| [\uC0-\uD6]
| [\uD8-\uF6]
| [\uF8-\u2FF]
| [\u370-\u37D]
| [\u37F-\u1FFF]
| [\u200C-\u200D]
| [\u2070-\u218F]
| [\u2C00-\u2FEF]
| [\u3001-\uD7FF]
| [\uF900-\uFDCF]
| [\uFDF0-\uFFFD]
| [\u10000-\uEFFFF]
;
namepartchar = namestartchar | digit | \uB7
| [\u0300-\u036F]
| [\u203F-\u2040]
;
additionalnamesymbols = .
| /
| -
| ’
| +
| *
;
literal = simple_literal | null
;
simpleliteral = numericliteral | stringliteral | booleanliteral | datetimeliteral ;
stringliteral = "
, { character – ("
| verticalspace) | stringescapesequence}, "
;
boolean_literal = true
| false
;
numeric_literal = [ -
] , ( digits , [ .
, digits ] | .
, digits ) ;
digit = [0-9] ;
digits = digit , { digit } ;
function_invocation = expression , parameters ;
parameters = (
, ( namedparameters | positionalparameters ) , )
;
namedparameters = parametername , :
, expression , { ,
, parameter name , :
, expression } ;
parameter_name = name ;
positional_parameters = [ expression , { ,
, expression } ] ;
path_expression = expression , .
, name ;
for_expression = for
, name , in
, iteration context { ,
, name , in
, iteration context } , return
, expression ;
if_expression = if
, expression , then
, expression , else
expression ;
quantified_expression = (some
| every
) , name , in
, expression , { ,
, name , in
, expression } , satisfies
, expression ;
disjunction = expression , or
, expression ;
conjunction = expression , and
, expression ;
comparison =
=
| !=
| <
| <=
| >
| >=
) , expression |between
, expression , and
, expression |in
, positiveunarytest |in
, (
, positive unary tests, )
;filter_expression = expression , [
, expression , ]
;
instance_of = expression , instance
, of
, type ;
type =
list
<
type >
|context
<
name :
type { ,
name :
type } >
|function
<
[ type { ,
type } ] >
->
type ;boxedexpression = list | functiondefinition | context ;
list = [
, [ expression , { ,
, expression } ] , ]
;
functiondefinition = function
, (
, [ formalparameter { ,
, formal parameter } ] , )
, [ external
] , expression ;
formalparameter = parametername [:
type ] ;
context = {
, [contextentry , { ,
, contextentry } ] , }
;
context_entry = key , :
, expression ;
key = name | string_literal ;
datetimeliteral = atliteral | functioninvocation ;
whitespace = verticalspace | \u0009
| \u0020
| \u0085
| \u00A0
| \u1680
| \u180E
| [\u2000-\u200B]
| \u2028
| \u2029
| \u202F
| \u205F
| \u3000
| \uFEFF
;
vertical_space = [\u000A-\u000D]
;
iteration_context = expression, [ ..
, expression ] ;
stringescapesequence = \'
| \"
| \\
| \n
| \r
| \t
| code_point;
atliteral = @
, stringliteral
Licensed under either of
at your option.
All contributions intentionally submitted for inclusion in the work by you, shall be dual licensed as above, without any additional terms or conditions.