Skip to content

EBNF syntax definition

Warning

The new tooling will be using a Parsing Expression Grammar (PEG) instead. For now, the EBNF syntax definition is still included here for archiving purposes. The up-to-date PEG can be found at grammar.pest.

Notation Should be read as
"abc" Literal text "abc"
\n Continue at the next line
DEF Terminal DEF
ghi Expansion of rule ghi
a b a followed by b
a | b Either a or b
a ( b | c) a followed by either a or b
[a] a or nothing
{a} Sequence of zero or more times a
{a}+ Sequence of one or more times a
x ::= b c x is defined as b followed by c
/* note */ Comment or additional constraint
EBNF syntax definition
esl-specification ::=
  { type-definition
  | verb-definition
  | relation-definition
  | world-section /* Exactly one */
  | component-definition }+

/* -------------------------------- */
/* Types */

type-definition ::=
  "define" "type" \n
  { new-singular-type \n
  | new-bundle-type \n
  }+

new-singular-type ::= (
  TYPE-NAME [ enumeration-specification | unit-specification | range-specification ]
|
  TYPE-NAME "is" ( "a" | "an" ) TYPE-NAME [
     unit-specification | range-specification
   ]
)

new-bundle-type ::=
  TYPE-NAME "is" "a" "bundle" "of" \n
  { "*" bundle-field-specification }+

bundle-field-specification ::= (
  FIELD-NAME "is" ( "a" | "an" ) TYPE-NAME
)

unit-specification ::=
  "with" ( "unit" | "units" ) UNIT-NAME { "," UNIT-NAME }

enumeration-specification ::=
  "is" "an" "enumeration" "of" VALUE [ unit ] { "," VALUE [ unit ]}

range-specification ::=
  ( interval-specification | constant-specification )

interval-specification ::=
  "of" interval { "or" interval }

interval ::=
  ( open-interval | closed-interval )

open-interval ::=
  ( lower-bound | upper-bound )

closed-interval ::=
  lower-bound "and" upper-bound

lower-bound ::=
  "at" "least" VALUE [ unit ]

upper-bound ::=
  "at" "most" VALUE [ unit ]

constant-specification ::=
  "equal" "to" VALUE [ unit ]

/* -------------------------------- */
/* Verbs and relations */

verb-definition ::=
    "define" "verb" \n
  { VERB PREPOSITION \n }+

relation-definition ::=
  "define" "relation" \n
  { RELATION-DEF-NAME \n
    { ( "requiring" | "returning" | "relating" ) "parameter"  \n
      { "*" ["one" "or" "more"] PARAMETER-NAME "is" ("a" | "an") TYPE-NAME \n }+
    }+ /* At most one requiring, returning and relating. */
  }+

/* -------------------------------- */
/* World and component */

world-section ::=
    "world" \n
  ( "empty" | { variable-section
              | group-section
              | component-section
              | need-section
              | goal-section
              | behavior-section
              | design-section
              | comment-section }+ )

component-definition ::=
    "define" "component" COMPONENT-KIND \n
  ( "empty" | { parameter-section
              | variable-section
              | group-section
              | transform-section
              | component-section
              | need-section
              | goal-section
              | behavior-section
              | design-section
              | comment-section }+ )

component-section ::=
    "component" \n
  { COMPONENT-NAME "is"
  ( "a" | "an" ) COMPONENT-KIND
  (  \n | arguments  )  }+

/* -------------------------------- */
/* Parameter and variable */

parameter-section ::=
    "parameter" \n
  { PARAMETER-NAME { "," PARAMETER-NAME }
    "is" ( "a" | "an" ) TYPE-NAME [ "property" ] \n
  }+

variable-section ::=
    "variable" \n
  { VARIABLE-NAME { "," VARIABLE-NAME }
    "is" ( "a" | "an" ) TYPE-NAME  \n
  }+

group-section ::=
  "variable-group" \n
  { group-definition }+

group-definition ::=
  GROUP-NAME "is" "a" "group" "of" \n
    argument-list

/* -------------------------------- */
/* Argument */

arguments ::=
    "with" "arguments" \n
    argument-list

argument-list ::=
  { "*" argument-name
    { "," argument-name } \n
  }+

argument-references ::=
    argument-name
  { and-connector argument-name } \n

and-connector ::=
    "and"
  | ","
  | "," "and"

argument-name ::=
    PARAMETER-NAME
  | VARIABLE-NAME

/* -------------------------------- */
/* Need */

need-section ::=
    "need" \n
  { NEED-NAME ":" need-literal \n }+

need-literal ::=
    subject-name { WORD }+

subject-name ::=
    argument-name
  | COMPONENT-NAME
  | GOAL-NAME
  | TRANSFORMATION-NAME
  | DESIGN-NAME
  | BEHAVIOR-NAME

/* -------------------------------- */
/* Goal */

goal-section ::=
    goal-type \n
  { GOAL-NAME ":" goal-literal }+

goal-type ::=
    "goal-requirement"
  | "goal-constraint"

goal-literal ::=
    COMPONENT-NAME
  ( "does"           /* constraint */
  | auxiliary-verb ) /* requirement */
    VERB argument-references PREPOSITION
    COMPONENT-NAME
  ( \n | subclauses )

/* -------------------------------- */
/* Behavior */

behavior-section ::=
  behavior-type \n
  { BEHAVIOR-NAME ":" \n
    behavior-clause
  }+

behavior-type ::=
  "behavior-requirement" | "behavior-constraint"

behavior-clause ::=
  {
    "case" CASE-NAME ":" \n
    ( regular-case-clause
    | fall-back-case-clause
    )
  }+ /* At most one fall-back-case-clause per behavior-clause. */

regular-case-clause ::=
  when-clause
  then-clause

when-clause ::=
  "when" \n
    { "*" CASE-CONDITION-NAME ":" comparison-rule-line \n }+ /* Only 'is' as auxiliary verb. */

then-clause ::=
  "then" \n
    { "*" CASE-RULE-NAME ":" comparison \n }+

fall-back-case-clause ::=
  "when" "no" "other" "case" "applies" \n
  then-clause


/* -------------------------------- */
/* Transform */

transform-section ::=
    transformation-type \n
  { TRANSFORMATION-NAME ":"
    transform-literal \n }+

transformation-type ::=
    "transformation-requirement"
  | "transformation-constraint"

transformation-literal ::=
  ( "does"           /* constraint */
  | auxiliary-verb ) /* requirement */
    VERB argument-references PREPOSITION
    argument-references
  ( \n | subclauses )

/* -------------------------------- */
/* Design-rules */

design-section ::=
    design-rule-type \n
  { DESIGN-RULE-NAME ":"
    design-rule-line }+

design-rule-type ::=
    "design-requirement"
  | "design-constraint"

design-rule-line ::=
  comparison-rule-line
  ( \n | subclauses )

/* -------------------------------- */
/* Subclauses */

subclauses ::=
  "with" "subclauses" \n
  { "*" SUBCLAUSE-NAME ":"
    comparison-rule-line \n
  }+

/* -------------------------------- */
/* Comparison */

comparison-rule-line ::=
  comparison
  { "or" comparison }

comparison ::=
  argument-name
  ( constraint-rule-literal | requirement-rule-literal )

constraint-rule-literal ::=
  "is" compare-op bound

requirement-rule-literal ::=
  auxiliary-verb "be"
  ( compare-op bound | objective )

compare-op ::=
    "smaller" "than"
  | "greater" "than"
  | "not" "equal" "to"
  | "equal" "to"
  | "at" "least"
  | "at" "most"
  | "approximately" /* Only in a requirement-rule-literal */

bound ::=
    argument-name
  | VALUE [ unit ]
  | "t.b.d." [ unit ]

unit ::=
    UNIT-NAME
  | "[" UNIT-NAME "]"

objective ::=
    "maximized"
  | "minimized"

/* -------------------------------- */
/* Relations */

relation-section ::=
  "relation" \n
  { RELATION-NAME ":" RELATION-DEF-NAME \n
    { ( "requiring" | "returning" | "relating" ) "argument"  \n
      { "*" argument-name \n }+
    }+ /* At most one requiring, returning and relating. */
  }+

/* -------------------------------- */
/* Comments */

comment-section ::=
    "comment"
  { target-name "#<" { WORD } \n }+

target-name ::=
    argument-name
  | COMPONENT-NAME
  | NEED-NAME
  | GOAL-NAME
  | TRANSFORMATION-NAME
  | RELATION-NAME

/* -------------------------------- */
/* Requirement verbs */

auxiliary-verb ::=
    "shall"
  | "must"
  | "should"
  | "could"
  | "won't"