A leírás BNF formátumot használ, a következő kiterjesztésekkel:
a, ... egy vagy több elem vesszővel elválasztva
{a} tetszőleges mennyiségű előfordulás,
nincs elválasztójel
[a] opcionális elem
A CLU-ban pontosvesszők használata opcionális: ámbár az alábbi leírásban
sehol sem használtuk
őket, a megszokott helyeken használva őket a fordítő nem fog hibát
jelezni!
module ::= {equate} procedure | {equate} iterator | {equate} cluster
procedure ::= idn = proc [parms] args [returns] [signals] [where] routine_body end idn
iterator ::= idn = iter [parms] args [yields] [signals] [where] routine_body end idn
cluster ::= idn = cluster [parms] is idn, ... [where] cluster_body end idn
parms ::= [parm, ...]
parm ::= idn, ... : type | idn, ... : type_spec
args ::= ([decl, ...])
decl ::= idn, ... : type_spec
returns ::= returns (type_spec, ...)
yields ::= yields (type_spec, ...)
signals ::= signals (exception, ...)
exception ::= name [(type_spec, ...)]
where ::= where restriction, ...
restriction ::= idn has oper_decl, ... | idn in type_set
type_set ::= {idn | idn has oper_decl, ... {equate}} | idn
oper_decl ::= op_name, ... : type_spec
op_name ::= name [[constant, ...]]
constant ::= expression | type_spec
routine_body ::= {equate} {own_var} {statement}
cluster_body ::= {equate} rep = type_spec {equate} {own_var} routine {routine}
routine ::= procedure | iterator
equate ::= idn = constant | idn = type_set
own_var ::= own decl | own idn : type_spec := expression | own decl, ... := invocation
type_spec ::= null | bool | int | real | char | string | any | rep | cvt | array [type_spec] | sequence [type_spec] | record [field_spec, ...] | struct [field_spec, ...] | variant [field_spec, ...] | oneof [field_spec, ...] | proctype ([type_spec, ...]) [returns] [signals] | itertype ([type_spec, ...]) [yields] [signals] | idn [constant, ...] | idn
field_spec ::= name, ... : type_spec
statement ::= decl | idn : type_spec := expression | decl, ... := invocation | idn, ... := invocation | idn, ... := expression, ... | primary.name := expression | primary [expression] := expression | invocation | while expression do body end | for [decl, ...] in invocation do body end | for [idn, ...] in invocation do body end | if expression then body {elseif expression then body} [else body] end | tagcase expression tag_arm {tag_arm} others : body end | return [(expression, ...)] | yield [(expression, ...)] | signal name [(expression, ...)] | exit name [(expression, ...)] | break | continue | begin body end | statement resignal name, ... | statement except {when_handler} [others_handler] end
tag_arm ::= tag name, ... [(idn : type_spec)] : body
when_handler ::= when name, ... [(decl, ...)] : body | when name, ... (*) : body
others_handler ::= others [(idn : type_spec)] : body
body ::= {equate} {statement}
expression ::= primary | (expression) % precedence | ~ expression % 6 | - expression % 6 | expression ** expression % 5 | expression // expression % 4 | expression / expression % 4 | expression * expression % 4 | expression || expression % 3 | expression + expression % 3 | expression - expression % 3 | expression < expression % 2 | expression <= expression % 2 | expression = expression % 2 | expression >= expression % 2 | expression > expression % 2 | expression ~< expression % 2 | expression ~<= expression % 2 | expression ~= expression % 2 | expression ~>= expression % 2 | expression ~> expression % 2 | expression & expression % 1 | expression cand expression % 1 | expression | expression % 0 | expression cor expression % 0
primary ::= nil | true | false | int_literal | real_literal | char_literal | string_literal | idn | idn [constant, ...] | primary.name | primary [expression] | invocation | type_spec${field, ...} | type_spec$[[expression :] [expression, ...]] | type_spec$name [[constant, ...]] | force [type_spec] | up (expression) | down (expression)
invocation ::= primary ([expression, ...])
field ::= name, ... : expression