Previous: Reserved keywords, Up: Input file format


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