// Generated from dotgen.y - manual changes will be lost
ifdef::sidebartoc[]
include::_Sidebar.adoc[]
endif::[]

Grammar reference
-----------------

****
[horizontal]
[[dotgen-rule-specification]](1) `*specification         ::=*` ::
   `{` <<grammar#dotgen-rule-statement,`statement`>> `}`
[[dotgen-rule-statement]](2) `*statement             ::=*` ::
   <<grammar#dotgen-rule-idl-statement,`idl-statement`>> +
                              `|` <<grammar#dotgen-rule-component,`component`>> +
                              `|` <<grammar#dotgen-rule-interface,`interface`>>
[[dotgen-rule-idl-statements]](3) `*idl-statements        ::=*` ::
   `{` <<grammar#dotgen-rule-idl-statement,`idl-statement`>> `}` <<grammar#dotgen-rule-idl-statement,`idl-statement`>>
[[dotgen-rule-idl-statement]](4) `*idl-statement         ::=*` ::
   <<grammar#dotgen-rule-module,`module`>> +
                              `|` <<grammar#dotgen-rule-const-dcl,`const-dcl`>> +
                              `|` <<grammar#dotgen-rule-type-dcl,`type-dcl`>>
[[dotgen-rule-component]](5) `*component             ::=*` ::
   `"component"` <<grammar#dotgen-rule-component-name,`component-name`>> <<grammar#dotgen-rule-component-body,`component-body`>> `";"`
[[dotgen-rule-component-name]](6) `*component-name        ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-component-body]](7) `*component-body        ::=*` ::
   `[` `"{"` <<grammar#dotgen-rule-exports,`exports`>> `"}"` `]`
[[dotgen-rule-exports]](8) `*exports               ::=*` ::
   `{` <<grammar#dotgen-rule-export,`export`>> `}`
[[dotgen-rule-export]](9) `*export                ::=*` ::
   <<grammar#dotgen-rule-idl-statement,`idl-statement`>> +
                              `|` <<grammar#dotgen-rule-property,`property`>> +
                              `|` <<grammar#dotgen-rule-ids,`ids`>> +
                              `|` <<grammar#dotgen-rule-task,`task`>> +
                              `|` <<grammar#dotgen-rule-port,`port`>> +
                              `|` <<grammar#dotgen-rule-attribute,`attribute`>> +
                              `|` <<grammar#dotgen-rule-service,`service`>>
[[dotgen-rule-component-property]](10) `*component-property    ::=*` ::
   `(` `"doc"` <<grammar#dotgen-rule-string-literals,`string-literals`>> +
                              `|` `"version"` <<grammar#dotgen-rule-string-literals,`string-literals`>> +
                              `|` `"lang"` <<grammar#dotgen-rule-string-literals,`string-literals`>> +
                              `|` `"email"` <<grammar#dotgen-rule-string-literals,`string-literals`>> +
                              `|` `"requires"` <<grammar#dotgen-rule-string-list,`string-list`>> +
                              `|` `"codels-require"` <<grammar#dotgen-rule-opt-private,`opt-private`>> <<grammar#dotgen-rule-string-list,`string-list`>> +
                              `|` `"clock-rate"` <<grammar#dotgen-rule-const-expr,`const-expr`>> <<grammar#dotgen-rule-time-unit,`time-unit`>> +
                              `|` `"provides"` <<grammar#dotgen-rule-interface-list,`interface-list`>> +
                              `|` `"uses"` <<grammar#dotgen-rule-interface-list,`interface-list`>> `)` `";"`
[[dotgen-rule-opt-private]](11) `*opt-private           ::=*` ::
   `[` `"private"` `]`
[[dotgen-rule-throw-property]](12) `*throw-property        ::=*` ::
   `"throws"` <<grammar#dotgen-rule-throw-list,`throw-list`>> `";"`
[[dotgen-rule-throw-list]](13) `*throw-list            ::=*` ::
   `{` <<grammar#dotgen-rule-named-type,`named-type`>> `","` `}` <<grammar#dotgen-rule-named-type,`named-type`>>
[[dotgen-rule-interface]](14) `*interface             ::=*` ::
   `"interface"` <<grammar#dotgen-rule-interface-scope,`interface-scope`>> <<grammar#dotgen-rule-component-body,`component-body`>> `";"`
[[dotgen-rule-interface-scope]](15) `*interface-scope       ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-interface-name]](16) `*interface-name        ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-interface-property]](17) `*interface-property    ::=*` ::
   `"extends"` <<grammar#dotgen-rule-interface-list,`interface-list`>> `";"`
[[dotgen-rule-interface-list]](18) `*interface-list        ::=*` ::
   `{` <<grammar#dotgen-rule-interface-name,`interface-name`>> `","` `}` <<grammar#dotgen-rule-interface-name,`interface-name`>>
[[dotgen-rule-ids]](19) `*ids                   ::=*` ::
   <<grammar#dotgen-rule-ids-name,`ids-name`>> `"{"` <<grammar#dotgen-rule-member-list,`member-list`>> `"}"` `";"`
[[dotgen-rule-ids-name]](20) `*ids-name              ::=*` ::
   `"ids"`
[[dotgen-rule-task]](21) `*task                  ::=*` ::
   `"task"` <<grammar#dotgen-rule-identifier,`identifier`>> <<grammar#dotgen-rule-opt-properties,`opt-properties`>> `";"`
[[dotgen-rule-task-property]](22) `*task-property         ::=*` ::
   `(` `"period"` <<grammar#dotgen-rule-const-expr,`const-expr`>> <<grammar#dotgen-rule-time-unit,`time-unit`>> +
                              `|` `"delay"` <<grammar#dotgen-rule-const-expr,`const-expr`>> <<grammar#dotgen-rule-time-unit,`time-unit`>> +
                              `|` `"priority"` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> +
                              `|` `"scheduling"` `"real-time"` +
                              `|` `"stack"` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> <<grammar#dotgen-rule-size-unit,`size-unit`>> `)` `";"`
[[dotgen-rule-port]](23) `*port                  ::=*` ::
   `"port"` <<grammar#dotgen-rule-opt-multiple,`opt-multiple`>> <<grammar#dotgen-rule-port-dir,`port-dir`>> <<grammar#dotgen-rule-type-spec,`type-spec`>> <<grammar#dotgen-rule-identifier,`identifier`>> <<grammar#dotgen-rule-opt-properties,`opt-properties`>> `";"`
[[dotgen-rule-port-dir]](24) `*port-dir              ::=*` ::
   `"in"` +
                              `|` `"out"`
[[dotgen-rule-opt-multiple]](25) `*opt-multiple          ::=*` ::
   `[` `"multiple"` `]`
[[dotgen-rule-attribute]](26) `*attribute             ::=*` ::
   `"attribute"` <<grammar#dotgen-rule-identifier,`identifier`>> `"("` <<grammar#dotgen-rule-attribute-parameters,`attribute-parameters`>> `")"` <<grammar#dotgen-rule-opt-properties,`opt-properties`>> `";"`
[[dotgen-rule-service]](27) `*service               ::=*` ::
   <<grammar#dotgen-rule-service-kind,`service-kind`>> <<grammar#dotgen-rule-identifier,`identifier`>> `"("` <<grammar#dotgen-rule-service-parameters,`service-parameters`>> `")"` <<grammar#dotgen-rule-opt-properties,`opt-properties`>> `";"`
[[dotgen-rule-service-kind]](28) `*service-kind          ::=*` ::
   `"function"` +
                              `|` `"activity"`
[[dotgen-rule-service-property]](29) `*service-property      ::=*` ::
   `(` `"task"` <<grammar#dotgen-rule-identifier,`identifier`>> +
                              `|` `"interrupts"` <<grammar#dotgen-rule-identifier-list,`identifier-list`>> +
                              `|` `"before"` <<grammar#dotgen-rule-identifier-list,`identifier-list`>> +
                              `|` `"after"` <<grammar#dotgen-rule-identifier-list,`identifier-list`>> +
                              `|` `"validate"` <<grammar#dotgen-rule-codel,`codel`>> +
                              `|` `"local"` <<grammar#dotgen-rule-local-variables,`local-variables`>> +
                              `|` `"visibility"` <<grammar#dotgen-rule-visibility-attribute,`visibility-attribute`>> `)` `";"`
[[dotgen-rule-attribute-parameters]](30) `*attribute-parameters  ::=*` ::
   `[` `{` <<grammar#dotgen-rule-attribute-parameter,`attribute-parameter`>> `","` `}` <<grammar#dotgen-rule-attribute-parameter,`attribute-parameter`>> `]`
[[dotgen-rule-attribute-parameter]](31) `*attribute-parameter   ::=*` ::
   <<grammar#dotgen-rule-parameter-dir,`parameter-dir`>> `(` <<grammar#dotgen-rule-parameter-variable,`parameter-variable`>> <<grammar#dotgen-rule-opt-initializer,`opt-initializer`>> +
                              `|` <<grammar#dotgen-rule-parameter-variable,`parameter-variable`>> `"::"` <<grammar#dotgen-rule-identifier,`identifier`>> <<grammar#dotgen-rule-opt-initializer,`opt-initializer`>> +
                              `|` `"::"` <<grammar#dotgen-rule-identifier,`identifier`>> <<grammar#dotgen-rule-opt-initializer,`opt-initializer`>> `)`
[[dotgen-rule-service-parameters]](32) `*service-parameters    ::=*` ::
   `[` `{` <<grammar#dotgen-rule-service-parameter,`service-parameter`>> `","` `}` <<grammar#dotgen-rule-service-parameter,`service-parameter`>> `]`
[[dotgen-rule-service-parameter]](33) `*service-parameter     ::=*` ::
   <<grammar#dotgen-rule-parameter-dir,`parameter-dir`>> <<grammar#dotgen-rule-type-spec,`type-spec`>> <<grammar#dotgen-rule-declarator,`declarator`>> <<grammar#dotgen-rule-opt-initializer,`opt-initializer`>>
[[dotgen-rule-local-variables]](34) `*local-variables       ::=*` ::
   `(` <<grammar#dotgen-rule-type-spec,`type-spec`>> +
                              `|` <<grammar#dotgen-rule-local-variables,`local-variables`>> `","` `)` <<grammar#dotgen-rule-declarator,`declarator`>>
[[dotgen-rule-codel]](35) `*codel                 ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>> `"("` <<grammar#dotgen-rule-codel-parameters,`codel-parameters`>> `")"`
[[dotgen-rule-fsm-codel]](36) `*fsm-codel             ::=*` ::
   `"<"` <<grammar#dotgen-rule-event-list,`event-list`>> `">"` <<grammar#dotgen-rule-identifier,`identifier`>> `"("` <<grammar#dotgen-rule-codel-parameters,`codel-parameters`>> `")"` `"yields"` <<grammar#dotgen-rule-event-list,`event-list`>>
[[dotgen-rule-opt-async]](37) `*opt-async             ::=*` ::
   `[` `"async"` `]`
[[dotgen-rule-event-name]](38) `*event-name            ::=*` ::
   `[` `"pause"` `"::"` `]` <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-event-list]](39) `*event-list            ::=*` ::
   `{` <<grammar#dotgen-rule-event-name,`event-name`>> `","` `}` <<grammar#dotgen-rule-event-name,`event-name`>>
[[dotgen-rule-codel-parameters]](40) `*codel-parameters      ::=*` ::
   `[` `{` <<grammar#dotgen-rule-codel-parameter,`codel-parameter`>> `","` `}` <<grammar#dotgen-rule-codel-parameter,`codel-parameter`>> `]`
[[dotgen-rule-codel-parameter]](41) `*codel-parameter       ::=*` ::
   <<grammar#dotgen-rule-opt-parameter-src,`opt-parameter-src`>> <<grammar#dotgen-rule-parameter-dir,`parameter-dir`>> `(` <<grammar#dotgen-rule-parameter-variable,`parameter-variable`>> +
                              `|` <<grammar#dotgen-rule-parameter-variable,`parameter-variable`>> `"::"` <<grammar#dotgen-rule-identifier,`identifier`>> +
                              `|` `"::"` <<grammar#dotgen-rule-identifier,`identifier`>> `)`
[[dotgen-rule-codel-property]](42) `*codel-property        ::=*` ::
   <<grammar#dotgen-rule-opt-async,`opt-async`>> `"codel"` `(` <<grammar#dotgen-rule-codel,`codel`>> `";"` +
                              `|` <<grammar#dotgen-rule-fsm-codel,`fsm-codel`>> `";"` `)`
[[dotgen-rule-opt-parameter-src]](43) `*opt-parameter-src     ::=*` ::
   `[` `"ids"` +
                              `|` `"local"` +
                              `|` `"port"` +
                              `|` `"remote"` `]`
[[dotgen-rule-parameter-dir]](44) `*parameter-dir         ::=*` ::
   `"in"` +
                              `|` `"out"` +
                              `|` `"inout"`
[[dotgen-rule-parameter-variable]](45) `*parameter-variable    ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>> +
                              `|` <<grammar#dotgen-rule-parameter-variable,`parameter-variable`>> `"."` <<grammar#dotgen-rule-identifier,`identifier`>> +
                              `|` <<grammar#dotgen-rule-parameter-variable,`parameter-variable`>> `"["` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> `"]"`
[[dotgen-rule-opt-initializer]](46) `*opt-initializer       ::=*` ::
   `[` `"="` <<grammar#dotgen-rule-initializer,`initializer`>> `]`
[[dotgen-rule-initializers]](47) `*initializers          ::=*` ::
   `[` `{` <<grammar#dotgen-rule-initializer,`initializer`>> `","` `}` <<grammar#dotgen-rule-initializer,`initializer`>> `]`
[[dotgen-rule-initializer]](48) `*initializer           ::=*` ::
   <<grammar#dotgen-rule-initializer-value,`initializer-value`>> +
                              `|` `":"` <<grammar#dotgen-rule-string-literals,`string-literals`>> +
                              `|` <<grammar#dotgen-rule-initializer-value,`initializer-value`>> `":"` <<grammar#dotgen-rule-string-literals,`string-literals`>>
[[dotgen-rule-initializer-value]](49) `*initializer-value     ::=*` ::
   <<grammar#dotgen-rule-const-expr,`const-expr`>> +
                              `|` `"{"` <<grammar#dotgen-rule-initializers,`initializers`>> `"}"` +
                              `|` `"["` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> `"]"` `"="` <<grammar#dotgen-rule-const-expr,`const-expr`>> +
                              `|` `"["` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> `"]"` `"="` `"{"` <<grammar#dotgen-rule-initializers,`initializers`>> `"}"` +
                              `|` `"["` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> `"]"` `"="` +
                              `|` `"."` <<grammar#dotgen-rule-identifier,`identifier`>> `"="` <<grammar#dotgen-rule-const-expr,`const-expr`>> +
                              `|` `"."` <<grammar#dotgen-rule-identifier,`identifier`>> `"="` `"{"` <<grammar#dotgen-rule-initializers,`initializers`>> `"}"` +
                              `|` `"."` <<grammar#dotgen-rule-identifier,`identifier`>> `"="`
[[dotgen-rule-module]](50) `*module                ::=*` ::
   `"module"` <<grammar#dotgen-rule-module-name,`module-name`>> `"{"` <<grammar#dotgen-rule-module-body,`module-body`>> `"}"` `";"`
[[dotgen-rule-module-name]](51) `*module-name           ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-module-body]](52) `*module-body           ::=*` ::
   `[` <<grammar#dotgen-rule-idl-statements,`idl-statements`>> `]`
[[dotgen-rule-struct-name]](53) `*struct-name           ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-union-name]](54) `*union-name            ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-exception-name]](55) `*exception-name        ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-scoped-name]](56) `*scoped-name           ::=*` ::
   `[` `[` <<grammar#dotgen-rule-scoped-name,`scoped-name`>> `]` `"::"` `]` <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-type-spec]](57) `*type-spec             ::=*` ::
   <<grammar#dotgen-rule-simple-type-spec,`simple-type-spec`>> +
                              `|` <<grammar#dotgen-rule-constructed-type-spec,`constructed-type-spec`>>
[[dotgen-rule-simple-type-spec]](58) `*simple-type-spec      ::=*` ::
   <<grammar#dotgen-rule-base-type-spec,`base-type-spec`>> +
                              `|` <<grammar#dotgen-rule-template-type-spec,`template-type-spec`>> +
                              `|` <<grammar#dotgen-rule-named-type,`named-type`>>
[[dotgen-rule-type-dcl]](59) `*type-dcl              ::=*` ::
   `"typedef"` <<grammar#dotgen-rule-type-declarator,`type-declarator`>> `";"` +
                              `|` `"native"` <<grammar#dotgen-rule-identifier,`identifier`>> `";"` +
                              `|` `"exception"` <<grammar#dotgen-rule-exception-list,`exception-list`>> `";"` +
                              `|` <<grammar#dotgen-rule-constructed-type,`constructed-type`>> `";"` +
                              `|` <<grammar#dotgen-rule-forward-dcl,`forward-dcl`>> `";"`
[[dotgen-rule-type-declarator]](60) `*type-declarator       ::=*` ::
   `(` <<grammar#dotgen-rule-type-spec,`type-spec`>> +
                              `|` <<grammar#dotgen-rule-type-declarator,`type-declarator`>> `","` `)` <<grammar#dotgen-rule-declarator,`declarator`>>
[[dotgen-rule-exception-list]](61) `*exception-list        ::=*` ::
   `{` <<grammar#dotgen-rule-exception-dcl,`exception-dcl`>> `","` `}` <<grammar#dotgen-rule-exception-dcl,`exception-dcl`>>
[[dotgen-rule-exception-dcl]](62) `*exception-dcl         ::=*` ::
   <<grammar#dotgen-rule-exception-name,`exception-name`>> <<grammar#dotgen-rule-opt-member-list,`opt-member-list`>>
[[dotgen-rule-opt-member-list]](63) `*opt-member-list       ::=*` ::
   `[` `"{"` `(` `"}"` +
                              `|` <<grammar#dotgen-rule-member-list,`member-list`>> `"}"` `)` `]`
[[dotgen-rule-named-type]](64) `*named-type            ::=*` ::
   <<grammar#dotgen-rule-scoped-name,`scoped-name`>>
[[dotgen-rule-declarator]](65) `*declarator            ::=*` ::
   <<grammar#dotgen-rule-simple-declarator,`simple-declarator`>> +
                              `|` <<grammar#dotgen-rule-array-declarator,`array-declarator`>>
[[dotgen-rule-simple-declarator]](66) `*simple-declarator     ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-array-declarator]](67) `*array-declarator      ::=*` ::
   `(` <<grammar#dotgen-rule-simple-declarator,`simple-declarator`>> +
                              `|` <<grammar#dotgen-rule-array-declarator,`array-declarator`>> `)` <<grammar#dotgen-rule-fixed-array-size,`fixed-array-size`>>
[[dotgen-rule-fixed-array-size]](68) `*fixed-array-size      ::=*` ::
   `"["` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> `"]"`
[[dotgen-rule-const-dcl]](69) `*const-dcl             ::=*` ::
   `"const"` <<grammar#dotgen-rule-const-type,`const-type`>> <<grammar#dotgen-rule-identifier,`identifier`>> `"="` <<grammar#dotgen-rule-const-expr,`const-expr`>> `";"`
[[dotgen-rule-const-type]](70) `*const-type            ::=*` ::
   <<grammar#dotgen-rule-integer-type,`integer-type`>> +
                              `|` <<grammar#dotgen-rule-char-type,`char-type`>> +
                              `|` <<grammar#dotgen-rule-boolean-type,`boolean-type`>> +
                              `|` <<grammar#dotgen-rule-floating-pt-type,`floating-pt-type`>> +
                              `|` <<grammar#dotgen-rule-octet-type,`octet-type`>> +
                              `|` <<grammar#dotgen-rule-string-type,`string-type`>> +
                              `|` <<grammar#dotgen-rule-named-type,`named-type`>>
[[dotgen-rule-base-type-spec]](71) `*base-type-spec        ::=*` ::
   <<grammar#dotgen-rule-boolean-type,`boolean-type`>> +
                              `|` <<grammar#dotgen-rule-integer-type,`integer-type`>> +
                              `|` <<grammar#dotgen-rule-floating-pt-type,`floating-pt-type`>> +
                              `|` <<grammar#dotgen-rule-char-type,`char-type`>> +
                              `|` <<grammar#dotgen-rule-octet-type,`octet-type`>> +
                              `|` <<grammar#dotgen-rule-any-type,`any-type`>>
[[dotgen-rule-integer-type]](72) `*integer-type          ::=*` ::
   <<grammar#dotgen-rule-signed-int,`signed-int`>> +
                              `|` <<grammar#dotgen-rule-unsigned-int,`unsigned-int`>>
[[dotgen-rule-signed-int]](73) `*signed-int            ::=*` ::
   <<grammar#dotgen-rule-signed-longlong-int,`signed-longlong-int`>> +
                              `|` <<grammar#dotgen-rule-signed-long-int,`signed-long-int`>> +
                              `|` <<grammar#dotgen-rule-signed-short-int,`signed-short-int`>>
[[dotgen-rule-unsigned-int]](74) `*unsigned-int          ::=*` ::
   <<grammar#dotgen-rule-unsigned-longlong-int,`unsigned-longlong-int`>> +
                              `|` <<grammar#dotgen-rule-unsigned-long-int,`unsigned-long-int`>> +
                              `|` <<grammar#dotgen-rule-unsigned-short-int,`unsigned-short-int`>>
[[dotgen-rule-unsigned-short-int]](75) `*unsigned-short-int    ::=*` ::
   `"unsigned"` `"short"`
[[dotgen-rule-unsigned-long-int]](76) `*unsigned-long-int     ::=*` ::
   `"unsigned"` `"long"`
[[dotgen-rule-unsigned-longlong-int]](77) `*unsigned-longlong-int ::=*` ::
   `"unsigned"` `"long"` `"long"`
[[dotgen-rule-signed-short-int]](78) `*signed-short-int      ::=*` ::
   `"short"`
[[dotgen-rule-signed-long-int]](79) `*signed-long-int       ::=*` ::
   `"long"`
[[dotgen-rule-signed-longlong-int]](80) `*signed-longlong-int   ::=*` ::
   `"long"` `"long"`
[[dotgen-rule-floating-pt-type]](81) `*floating-pt-type      ::=*` ::
   <<grammar#dotgen-rule-float-type,`float-type`>> +
                              `|` <<grammar#dotgen-rule-double-type,`double-type`>>
[[dotgen-rule-float-type]](82) `*float-type            ::=*` ::
   `"float"`
[[dotgen-rule-double-type]](83) `*double-type           ::=*` ::
   `"double"`
[[dotgen-rule-char-type]](84) `*char-type             ::=*` ::
   `"char"`
[[dotgen-rule-boolean-type]](85) `*boolean-type          ::=*` ::
   `"boolean"`
[[dotgen-rule-octet-type]](86) `*octet-type            ::=*` ::
   `"octet"`
[[dotgen-rule-any-type]](87) `*any-type              ::=*` ::
   `"any"`
[[dotgen-rule-template-type-spec]](88) `*template-type-spec    ::=*` ::
   <<grammar#dotgen-rule-sequence-type,`sequence-type`>> +
                              `|` <<grammar#dotgen-rule-optional-type,`optional-type`>> +
                              `|` <<grammar#dotgen-rule-string-type,`string-type`>> +
                              `|` <<grammar#dotgen-rule-fixed-type,`fixed-type`>>
[[dotgen-rule-sequence-type]](89) `*sequence-type         ::=*` ::
   `"sequence"` `"<"` <<grammar#dotgen-rule-simple-type-spec,`simple-type-spec`>> `(` `">"` +
                              `|` `","` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> `">"` `)`
[[dotgen-rule-optional-type]](90) `*optional-type         ::=*` ::
   `"optional"` `"<"` <<grammar#dotgen-rule-simple-type-spec,`simple-type-spec`>> `">"`
[[dotgen-rule-string-type]](91) `*string-type           ::=*` ::
   `"string"` `[` `"<"` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> `">"` `]`
[[dotgen-rule-fixed-type]](92) `*fixed-type            ::=*` ::
   `"fixed"` `[` `"<"` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> `","` <<grammar#dotgen-rule-positive-int-const,`positive-int-const`>> `">"` `]`
[[dotgen-rule-constructed-type-spec]](93) `*constructed-type-spec ::=*` ::
   <<grammar#dotgen-rule-constructed-type,`constructed-type`>>
[[dotgen-rule-constructed-type]](94) `*constructed-type      ::=*` ::
   <<grammar#dotgen-rule-struct-type,`struct-type`>> +
                              `|` <<grammar#dotgen-rule-union-type,`union-type`>> +
                              `|` <<grammar#dotgen-rule-enum-type,`enum-type`>>
[[dotgen-rule-struct-type]](95) `*struct-type           ::=*` ::
   `"struct"` <<grammar#dotgen-rule-struct-name,`struct-name`>> `"{"` <<grammar#dotgen-rule-member-list,`member-list`>> `"}"`
[[dotgen-rule-member-list]](96) `*member-list           ::=*` ::
   `{` <<grammar#dotgen-rule-member,`member`>> `";"` `}` <<grammar#dotgen-rule-member,`member`>> `";"`
[[dotgen-rule-member]](97) `*member                ::=*` ::
   `(` <<grammar#dotgen-rule-type-spec,`type-spec`>> +
                              `|` <<grammar#dotgen-rule-member,`member`>> `","` `)` <<grammar#dotgen-rule-declarator,`declarator`>>
[[dotgen-rule-union-type]](98) `*union-type            ::=*` ::
   `"union"` <<grammar#dotgen-rule-union-name,`union-name`>> `"switch"` `"("` <<grammar#dotgen-rule-switch-type-spec,`switch-type-spec`>> `")"` `"{"` <<grammar#dotgen-rule-switch-body,`switch-body`>> `"}"`
[[dotgen-rule-switch-type-spec]](99) `*switch-type-spec      ::=*` ::
   <<grammar#dotgen-rule-integer-type,`integer-type`>> +
                              `|` <<grammar#dotgen-rule-char-type,`char-type`>> +
                              `|` <<grammar#dotgen-rule-boolean-type,`boolean-type`>> +
                              `|` <<grammar#dotgen-rule-enum-type,`enum-type`>> +
                              `|` <<grammar#dotgen-rule-named-type,`named-type`>>
[[dotgen-rule-switch-body]](100) `*switch-body           ::=*` ::
   `{` <<grammar#dotgen-rule-case,`case`>> `}` <<grammar#dotgen-rule-case,`case`>>
[[dotgen-rule-case]](101) `*case                  ::=*` ::
   <<grammar#dotgen-rule-case-label-list,`case-label-list`>> <<grammar#dotgen-rule-type-spec,`type-spec`>> <<grammar#dotgen-rule-declarator,`declarator`>> `";"`
[[dotgen-rule-case-label-list]](102) `*case-label-list       ::=*` ::
   `{` <<grammar#dotgen-rule-case-label,`case-label`>> `}` <<grammar#dotgen-rule-case-label,`case-label`>>
[[dotgen-rule-case-label]](103) `*case-label            ::=*` ::
   `(` `"case"` <<grammar#dotgen-rule-const-expr,`const-expr`>> +
                              `|` `"default"` `)` `":"`
[[dotgen-rule-enum-type]](104) `*enum-type             ::=*` ::
   `"enum"` <<grammar#dotgen-rule-identifier,`identifier`>> `"{"` <<grammar#dotgen-rule-enumerator-list,`enumerator-list`>> `"}"`
[[dotgen-rule-enumerator-list]](105) `*enumerator-list       ::=*` ::
   `{` <<grammar#dotgen-rule-enumerator,`enumerator`>> `","` `}` <<grammar#dotgen-rule-enumerator,`enumerator`>>
[[dotgen-rule-enumerator]](106) `*enumerator            ::=*` ::
   <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-forward-dcl]](107) `*forward-dcl           ::=*` ::
   `(` `"struct"` +
                              `|` `"union"` `)` <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-identifier]](108) `*identifier            ::=*` ::
   `"[A-Za-z-][A-Za-z0-9-]*"` +
                              `|` `"s"` +
                              `|` `"ms"` +
                              `|` `"us"` +
                              `|` `"k"` +
                              `|` `"m"` +
                              `|` `"real-time"` +
                              `|` `"interface"` +
                              `|` `"component"` +
                              `|` `"ids"` +
                              `|` `"attribute"` +
                              `|` `"function"` +
                              `|` `"activity"` +
                              `|` `"version"` +
                              `|` `"lang"` +
                              `|` `"email"` +
                              `|` `"requires"` +
                              `|` `"codels-require"` +
                              `|` `"clock-rate"` +
                              `|` `"task"` +
                              `|` `"task"` +
                              `|` `"period"` +
                              `|` `"delay"` +
                              `|` `"priority"` +
                              `|` `"scheduling"` +
                              `|` `"stack"` +
                              `|` `"codel"` +
                              `|` `"validate"` +
                              `|` `"yields"` +
                              `|` `"pause"` +
                              `|` `"throws"` +
                              `|` `"doc"` +
                              `|` `"interrupts"` +
                              `|` `"before"` +
                              `|` `"after"` +
                              `|` `"handle"` +
                              `|` `"port"` +
                              `|` `"in"` +
                              `|` `"out"` +
                              `|` `"inout"` +
                              `|` `"local"` +
                              `|` `"async"` +
                              `|` `"remote"` +
                              `|` `"extends"` +
                              `|` `"provides"` +
                              `|` `"uses"` +
                              `|` `"multiple"` +
                              `|` `"native"` +
                              `|` `"exception"` +
                              `|` `"visibility"` +
                              `|` `"hidden"`
[[dotgen-rule-identifier-list]](109) `*identifier-list       ::=*` ::
   `{` <<grammar#dotgen-rule-identifier,`identifier`>> `","` `}` <<grammar#dotgen-rule-identifier,`identifier`>>
[[dotgen-rule-const-expr]](110) `*const-expr            ::=*` ::
   <<grammar#dotgen-rule-or-expr,`or-expr`>>
[[dotgen-rule-positive-int-const]](111) `*positive-int-const    ::=*` ::
   <<grammar#dotgen-rule-const-expr,`const-expr`>>
[[dotgen-rule-or-expr]](112) `*or-expr               ::=*` ::
   `{` <<grammar#dotgen-rule-xor-expr,`xor-expr`>> `"|"` `}` <<grammar#dotgen-rule-xor-expr,`xor-expr`>>
[[dotgen-rule-xor-expr]](113) `*xor-expr              ::=*` ::
   `{` <<grammar#dotgen-rule-and-expr,`and-expr`>> `"^"` `}` <<grammar#dotgen-rule-and-expr,`and-expr`>>
[[dotgen-rule-and-expr]](114) `*and-expr              ::=*` ::
   `{` <<grammar#dotgen-rule-shift-expr,`shift-expr`>> `"&"` `}` <<grammar#dotgen-rule-shift-expr,`shift-expr`>>
[[dotgen-rule-shift-expr]](115) `*shift-expr            ::=*` ::
   `{` <<grammar#dotgen-rule-add-expr,`add-expr`>> `(` `">>"` +
                              `|` `"<<"` `)` `}` <<grammar#dotgen-rule-add-expr,`add-expr`>>
[[dotgen-rule-add-expr]](116) `*add-expr              ::=*` ::
   `{` <<grammar#dotgen-rule-mult-expr,`mult-expr`>> `(` `"+"` +
                              `|` `"-"` `)` `}` <<grammar#dotgen-rule-mult-expr,`mult-expr`>>
[[dotgen-rule-mult-expr]](117) `*mult-expr             ::=*` ::
   `{` <<grammar#dotgen-rule-unary-expr,`unary-expr`>> `(` `"*"` +
                              `|` `"/"` +
                              `|` `"%"` `)` `}` <<grammar#dotgen-rule-unary-expr,`unary-expr`>>
[[dotgen-rule-unary-expr]](118) `*unary-expr            ::=*` ::
   `[` `"-"` +
                              `|` `"+"` +
                              `|` `"~"` `]` <<grammar#dotgen-rule-primary-expr,`primary-expr`>>
[[dotgen-rule-primary-expr]](119) `*primary-expr          ::=*` ::
   <<grammar#dotgen-rule-literal,`literal`>> +
                              `|` `"("` <<grammar#dotgen-rule-const-expr,`const-expr`>> `")"` +
                              `|` <<grammar#dotgen-rule-named-type,`named-type`>>
[[dotgen-rule-literal]](120) `*literal               ::=*` ::
   `"TRUE"` +
                              `|` `"FALSE"` +
                              `|` `integer-literal` +
                              `|` `"<float-literal>"` +
                              `|` `"<fixed-literal>"` +
                              `|` `"<char-literal>"` +
                              `|` <<grammar#dotgen-rule-string-literals,`string-literals`>>
[[dotgen-rule-string-literals]](121) `*string-literals       ::=*` ::
   `{` `string-literal` `}` `string-literal`
[[dotgen-rule-string-list]](122) `*string-list           ::=*` ::
   `{` <<grammar#dotgen-rule-string-literals,`string-literals`>> `","` `}` <<grammar#dotgen-rule-string-literals,`string-literals`>>
[[dotgen-rule-time-unit]](123) `*time-unit             ::=*` ::
   `[` `"s"` +
                              `|` `"ms"` +
                              `|` `"us"` `]`
[[dotgen-rule-size-unit]](124) `*size-unit             ::=*` ::
   `[` `"k"` +
                              `|` `"m"` `]`
[[dotgen-rule-opt-properties]](125) `*opt-properties        ::=*` ::
   `[` `"{"` <<grammar#dotgen-rule-properties,`properties`>> `"}"` `]`
[[dotgen-rule-properties]](126) `*properties            ::=*` ::
   `{` <<grammar#dotgen-rule-property,`property`>> `}`
[[dotgen-rule-property]](127) `*property              ::=*` ::
   <<grammar#dotgen-rule-component-property,`component-property`>> +
                              `|` <<grammar#dotgen-rule-interface-property,`interface-property`>> +
                              `|` <<grammar#dotgen-rule-task-property,`task-property`>> +
                              `|` <<grammar#dotgen-rule-service-property,`service-property`>> +
                              `|` <<grammar#dotgen-rule-codel-property,`codel-property`>> +
                              `|` <<grammar#dotgen-rule-throw-property,`throw-property`>>
[[dotgen-rule-visibility-attribute]](128) `*visibility-attribute  ::=*` ::
   `"hidden"` +
                              `|` `"default"`

****
