Corren Docs Grammar Reference

Grammar Reference

Grammaire formelle BNF du langage FaRl (Financial accounting Rule Language). La notation utilisée est EBNF — les éléments entre [ ] sont optionnels, { } signifie zéro ou plusieurs répétitions, | est l'alternation.

Script

Un script FaRl est une séquence de déclarations de variables suivies d'instructions.

ebnf
script     ::= { var_decl } { statement }

var_decl   ::= "var" VARIABLE ":" type_name
                 [ "=" "meta" "(" account "," STRING ")" ]

type_name  ::= "account" | "monetary" | "asset"
             | "portion"  | "number"   | "string"

Statement

ebnf
statement  ::= transfer_stmt
             | set_stmt
             | print_stmt
             | fail_stmt

Transfer statement

ebnf
transfer_stmt  ::= "transfer" monetary_expr "("
                     ( from_clause to_clause
                     | to_clause   from_clause )
                   ")"

from_clause    ::= "from" source
to_clause      ::= "to"   destination

Source

ebnf
source       ::= account_ref
             | "max" monetary_lit "from" account_ref
             | allotment_source
             | ordered_source

ordered_source    ::= "{" { ordered_src_item } "}"
ordered_src_item  ::= account_ref
                    | "max" monetary_lit "from" account_ref

allotment_source  ::= "{" { allot_src_item } "}"
allot_src_item    ::= portion "from" account_ref

account_ref       ::= ACCOUNT | VARIABLE

Destination

ebnf
destination       ::= account_ref
                    | allotment_dest
                    | ordered_dest

allotment_dest    ::= "{" { allot_dest_item } "}"
allot_dest_item   ::= ( portion | "remaining" ) "to" account_ref

ordered_dest      ::= "{" { ordered_dest_item } "}"
ordered_dest_item ::= [ "max" monetary_lit ] "to" account_ref

Monetary expressions

ebnf
monetary_expr  ::= monetary_lit | monetary_all | VARIABLE

monetary_lit   ::= "[" ASSET NUMBER "]"
monetary_all   ::= "[" ASSET "*" "]"

(* ASSET inclut la précision optionnelle : DZD, DZD.2, EUR.2 *)
ASSET          ::= UPPER { UPPER | DIGIT } [ "." DIGIT { DIGIT } ]

Portion

ebnf
portion  ::= VARIABLE
         | NUMBER "/" NUMBER   (* ex: 90/100 *)
         | NUMBER "%"           (* ex: 15%    *)
         | FLOAT  "%"           (* ex: 12.5%  *)

Variables

ebnf
VARIABLE  ::= "$" IDENT

(* Injectées via le corps JSON de l'API : *)
(* "vars": { "sale": "@vente:0042", "rate": "12%" } *)

set metadata

ebnf
set_stmt       ::= set_tx_meta | set_acct_meta

set_tx_meta    ::= "set transaction metadata"
                   ( STRING "=" literal
                   | "{" { STRING "=" literal } "}" )

set_acct_meta  ::= "set account metadata of" account_ref
                   "key" STRING "=" literal

literal        ::= STRING | NUMBER | portion
ebnf
print_stmt  ::= "print" expr
fail_stmt   ::= "fail"

expr        ::= NUMBER
            | expr ( "+" | "-" | "*" | "/" ) expr
            | account_ref
            | VARIABLE

Éléments lexicaux

ebnf
ACCOUNT  ::= "@" IDENT { ":" IDENT }
(* ex: @alice, @users:001, @courses:0587:paiement *)

IDENT    ::= ( LETTER | "_" ) { LETTER | DIGIT | "_" | "-" }

STRING   ::= '"' { CHAR } '"'

NUMBER   ::= DIGIT { DIGIT }
FLOAT    ::= NUMBER "." NUMBER

COMMENT  ::= "//" { CHAR } NEWLINE
(* Les commentaires sont ignorés par le lexer *)

UPPER    ::= "A" | ... | "Z"
LETTER   ::= UPPER | "a" | ... | "z"
DIGIT    ::= "0" | ... | "9"