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
print / fail
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"