name-ref ::= identifier, [ "[", name, { ",", name }, [ "," ] "]" ]; name-decl ::= identifier, [ "[", identifier, { ",", identifier }, [ "," ], "]" ]; elementary-type ::= "int"; required-pointer-type ::= "*", type; optional-pointer-type ::= "?", type; struct-type ::= "struct", parameters; enum-type ::= "enum", type, "(", [ enum-value, { ",", enum-value }, [ "," ], ")"; enum-value ::= name-decl, "=", value; type-storage ::= required-pointer-type, optional-pointer-type, struct-type, enum-type, elementary-type, name-ref; constraint ::= "constraint", expression; type ::= [ "const" ], [ "keep" ], type-storage, { constraint }; parameters ::= "(", [ type, name-decl, { ",", type, name-decl } ], [ "," ], ")"; declaration ::= function-decl, type-decl, var-decl; function-decl ::= parameters, (* return values *) name-decl, (* name *) parameters, (* parameters *) code-block | ";"; (* code *) type-decl ::= "typedef", name-decl, (* name *) [ "=" type ], (* definition *) ";"; var-decl ::= name-ref, (* type *) name-decl, (* name *) [ "=", expression ], (* initial value [default is an invalid value) *) ";"; code-block ::= "{", { code-statement, ";" }, "}"; code-statement ::= declaration, (int r) hypot(int a, int b) { r = sqrt(a^2 + b^2) } () print(string s) { if (posix.write(STDOUT, s.data, s.length) == -1) { } }