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