Steve Dower | Musings and Mutterings

ESDL Grammar

ESDL is very much still under development. Part of this development process requires community feedback and engagement. Ideally, a number of alternate implementations will be constructed, allowing a greater range of researchers to experiment with ESDL.

However, implementation is difficult. The whole point of ESDL is to support algorithm sharing within the Evolutionary Computation community. At present, the only (known) implementation of ESDL is in esec.

This page contains a BNF-style grammar describing ESDL in its current form. This is anticipated to change over time based on feedback from users. It is labelled “BNF-style” because this grammar can’t be used directly with any parser generator; it is intended as a specification for humans, not machines.

Any feedback can be sent to the email shown here.

System      : Statements EOS (BlockStmt EOS)*

EOS         : <a new line, except when immediately after a backslash>

Statement   : RepeatStmt EOS
            | FromStmt EOS
            | JoinStmt EOS
            | YieldStmt EOS
            | EvalStmt EOS
            | PragmaStmt EOS
            | AssignStmt EOS
            | CallFunc EOS

Statements  : <zero or more Statement>

BlockStmt   : "BEGIN" Name EOS Statements "END"

RepeatStmt  : "REPEAT" Expression EOS Statements "END"

FromStmt    : "FROM" GroupOrGenerators "SELECT" SizedGroups ("USING" Operators)?
JoinStmt    : "JOIN" Groups "INTO" Groups ("USING" Operators)?

YieldStmt   : "YIELD" Groups

EvalStmt    : "EVAL"     Groups ("USING" Operators)?
            | "EVALUATE" Groups ("USING" Operators)?

PragmaStmt  : "`" <anything> EOS

AssignStmt  : Name "=" Expression

Expression  : Operand (BinaryOp Operand)*

Operand     : Name                          // variable
            | CallFunc
            | Number                        // constant
            | "(" Expression ")"
            | UnaryOp Operand
            | "true"
            | "false"
            | "null" | "none"

UnaryOp     : "-"
BinaryOp    : "+" | "-" | "*" | "/" | "^" | "."

Parameter   : Name "=" Expression           // explicit parameter
            | Name                          // implicit parameter, see [TR/CIS/2010/7](/publications#esdl_implicit_parameter_proposal_2010)

CallFunc    : Name "(" Parameter ("," Parameter)* ")"

Groups      : Name (',' Groups)*
SizedGroups : Expression Name (',' SizedGroups)* // sized group
            |            Name (',' SizedGroups)* // unsized group

GroupsOrGenerators
            : Name      ("," GroupsOrGenerators)*
            | CallFunc  ("," GroupsOrGenerators)*

Operators   : Name     ("," Operators)*
            | CallFunc ("," Operators)*