.. _`IDL Pre-processor Grammar`:


#########################
IDL Pre-processor Grammar
#########################

*The Vortex OpenSplice IDL Pre-processor accepts the grammar which complies with
the CORBA Specification. The Vortex OpenSplice IDL Pre-processor accepts the
complete grammar, but it will ignore elements not relevant to the definition
of data types.*

In the following specification of the grammar (similar to EBNF), elements
that are processed by the Vortex OpenSplice IDL Pre-processor are highlighted 
in **bold**. Note that Vortex OpenSplice does not support all base types that 
are specified by the OMG.

The ``idlpp`` also takes into account all C pre-processor directives that 
are common to ANSI-C, like ``#include``, ``#define``, ``#ifdef``, *etc.*.

.. centered:: **The OMG's IDL Grammar**

.. tabularcolumns:: | l | c | p{9.4cm} |

+---------------------+------+--------------------------------------------+
| <specification>     | ::=  | <import>* **<definition>+**                |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <definition>        | ::=  | <type_dcl> ";" <ann_appl_post> |           |
|                     |      | **<type_dcl>** ";" | **<const_dcl>**       |
|                     |      | ";" | <except_dcl> ";" | <interface>       |
|                     |      | ";" | **<module>** ";" | <value> ";" |     |
|                     |      | <type_id_dcl> ";" | <type_prefix_dcl>      |
|                     |      | ";" | <event> ";" | <component> ";" |      |
|                     |      | <home_dcl> ";" |                           |
|                     |      | <annotation> ";" <ann_appl_post>           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <annotation>        | ::=  | <ann_dcl> | <ann_fwd_dcl>                  |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_dcl>           | ::=  | <ann_header> "{" <ann_body> "}"            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_fwd_dcl>       | ::=  | "@Annotation [ "(" ")" ] local             |
|                     |      | interface" <identifier>                    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_header>        | ::=  | "@Annotation [ "(" ")" ] local             |
|                     |      | interface" <identifier>                    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_body>          | ::=  | <ann_attr>*                                |
+---------------------+------+--------------------------------------------+
| <ann_inheri\        | ::=  | ":" <annotation_name>                      |
| tance_spec>         |      |                                            |
+---------------------+------+--------------------------------------------+
| <annotation_name>   | ::=  | <scoped_name>                              |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_attr>          | ::=  | <ann_appl> "attribute" <param_type_spec>   |
|                     |      | <simple_declarator> [ "default"            |
|                     |      | <const_exp> ] ";" <ann_appl_post>          |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_appl>          | ::=  | { "@" <ann_appl_dcl> }*                    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_appl_post>     | ::=  | { "//@" <ann_appl_dcl> }*                  |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_appl_dcl>      | ::=  | <annotation_name> [ "(" [                  |
|                     |      | <ann_appl_params> ] ")" ]                  |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_appl_params>   | ::=  | <const_exp> | <ann_appl_param> { ","       |
|                     |      | <ann_appl_param> }*                        |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <ann_appl_param>    | ::=  | <identifier> "="                           |
|                     |      | <const_exp>                                |
+---------------------+------+--------------------------------------------+
| <struct_header>     | ::=  | <ann_appl> "struct" <identifier> [ ":"     |
|                     |      | <scoped_name> ]                            |
+---------------------+------+--------------------------------------------+
| <switch_type\       | ::=  | <integer_type> | <char_type> |             |
|                     |      | <wide_char_type> | <boolean_type> |        |
|                     |      | <enum_type> | <octet_type> |               |
|                     |      | <scoped_name>                              |
+---------------------+------+--------------------------------------------+
| <map_type>          | ::=  | "map" "<" <simple_type_spec> ","           |
|                     |      | <ann_appl> <simple_type_spec> ","          |
|                     |      | <ann_appl_post> <positive_int_const>       |
|                     |      | ">" | "map" "<" <simple_type_spec> ","     |
|                     |      | <ann_appl> <simple_type_spec>              |
|                     |      | <ann_appl_post> ">"                        |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <module>            | ::=  | **"module" <identifier> "{"                |
|                     |      | <definition>+ "}"**                        |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <interface>         | ::=  | <interface_dcl> | <forward_dcl>            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <interface_dcl>     | ::=  | <interface_header> "{"                     |
|                     |      | <interface_body> "}"                       |
+---------------------+------+--------------------------------------------+
| <forward_dcl>       | ::=  | [ "abstract" | "local"                     |
|                     |      | ] "interface" <identifier>                 |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <interface_header>  | ::=  | [ "abstract" | "local" ] "interface"       |
|                     |      | <identifier>                               |
|                     |      | [ <interface_inheritance_spec> ]           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <interface_body>    | ::=  | <export>*                                  |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <export>            | ::=  | <type_dcl> ";" | <const_dcl> ";" |         |
|                     |      | <except_dcl> ";" | <attr_dcl> ";" |        |
|                     |      | <op_dcl> ";" | <type_id_dcl> ";" |         |
|                     |      | <type_prefix_dcl> ";"                      |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <interface_inher\   | ::=  | ":" <interface_name> {                     |
| itance_spec>        |      | "," <interface_name>                       |
|                     |      | }*                                         |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <interface_name>    | ::=  | <scoped_name>                              |
+---------------------+------+--------------------------------------------+
| <scoped_name>       | ::=  | **<identifier>** | **"::"                  |
|                     |      | <identifier>** | **<scoped_name> "::"      |
|                     |      | <identifier>**                             |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <value>             | ::=  | (<value_dcl> | <value_abs_dcl> |           |
|                     |      | <value_box_dcl> | <value_forward_dcl>)     |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <value_forward\     | ::=  | [ "abstract" ] "valuetype"                 |
| _dcl>               |      | <identifier>                               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <value_box_dcl>     | ::=  | "valuetype" <identifier> <type_spec>       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <value_abs_dcl>     | ::=  | "abstract" "valuetype" <identifier> [      |
|                     |      | <value_inheritance_spec> ]                 |
|                     |      | "{" <export>* "}"                          |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <value_dcl>         | ::=  | <value_header> "{" <                       |
|                     |      | value_element>* "}"                        |
+---------------------+------+--------------------------------------------+
| <value_header>      | ::=  | ["custom" ] "valuetype" <identifier> [     |
|                     |      | <value_inheritance_spec> ]                 |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <value_inher\       | ::=  | [ ":" [ "truncatable" ] <value_name> {     |
| itance_spec>        |      | "," <value_name> }* ] [ "supports"         |
|                     |      | <interface_name> { ","                     |
|                     |      | <interface_name> }* ]                      |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <value_name>        | ::=  | <scoped_name>                              |
+---------------------+------+--------------------------------------------+
| <value_element>     | ::=  | <export> | < state_member> | <init_dcl>    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <state_member>      | ::=  | ("public" | "private")<type_spec>          |
|                     |      | <declarators>";"                           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <init_dcl>          | ::=  | "factory" <identifier> "(" [               |
|                     |      | <init_param_decls> ] ")" [                 |
|                     |      | <raises_expr> ] ";"                        |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <init_param_decls>  | ::=  | <init_param_decl> { ","                    |
|                     |      | <init_param_decl> }*                       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <init_param_decl>   | ::=  | <init_param_attribute> <param_type_spec>   |
|                     |      | <simple_declarator>                        |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <init_param\        | ::=  | "in"                                       |
| _attribute>         |      |                                            |
+---------------------+------+--------------------------------------------+
| <const_dcl>         | ::=  | **"const" <const_type> <identifier>        |
|                     |      | "=" <const_exp>**                          |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <const_type>        | ::=  | **<integer_type>** | **<char_type>** |     |
|                     |      | <wide_char_type> | **<boolean_type>** |    |
|                     |      | **<floating_pt_type>** |                   |
|                     |      | **<string_type> | <wide_string_type> |     |
|                     |      | <fixed_pt_const_type> |                    |
|                     |      | **<scoped_name>** | **<octet_type>**       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <const_exp>         | ::=  | **<or_expr>**                              |
+---------------------+------+--------------------------------------------+
| <or_expr>           | ::=  | **<xor_expr>** | **<or_expr> "|"           |
|                     |      | <xor_expr>**                               |
+---------------------+------+--------------------------------------------+
| <xor_expr>          | ::=  | **<and_expr>** | **<xor_expr> "^"          |
|                     |      | <and_expr>**                               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <and_expr>          | ::=  | **<shift_expr>** | **<and_expr> "&"        |
|                     |      | <shift_expr>**                             |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <shift_expr>        | ::=  | **<add_expr>** | **<shift_expr> ">>"       |
|                     |      | <add_expr>** | **<shift_expr> "<<"         |
|                     |      | <add_expr>**                               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <add_expr>          | ::=  | **<mult_expr>** | **<add_expr> "+"         |
|                     |      | <mult_expr>** | **<add_expr> "-"           |
|                     |      | <mult_expr>**                              |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <mult_expr>         | ::=  | **<unary_expr>** | **<mult_expr> "*"       |
|                     |      | <unary_expr>** | **<mult_expr> "/"         |
|                     |      | <unary_expr>** | **<mult_expr> "%"         |
|                     |      | <unary_expr>**                             |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <unary_expr>        | ::=  | **<unary_operator> <primary_expr>** |      |
|                     |      | **<primary_expr>**                         |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <unary_operator>    | ::=  | **"-"** | **"+"** | **"~"**                |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <primary_expr>      | ::=  | **<scoped_name>** | **<literal>** |        |
|                     |      | **"(" <const_exp> ")"**                    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <literal>           | ::=  | **<integer_literal>** |                    |
|                     |      | **<string_literal>** |                     |
|                     |      | <wide_string_literal> |                    |
|                     |      | **<character_literal>** |                  |
|                     |      | <wide_character_literal> |                 |
|                     |      | <fixed_pt_literal> |                       |
|                     |      | **<floating_pt_literal>** |                |
|                     |      | <boolean_literal>                          |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <boolean_literal>   | ::=  | **"TRUE"** | **"FALSE"**                   |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <positive_int\      | ::=  | **<const_exp>**                            |
| _const>             |      |                                            |
+---------------------+------+--------------------------------------------+
| <type_dcl>          | ::=  | **"typedef" <type_declarator>** |          |
|                     |      | **<struct_type>** | **<union_type>** |     |
|                     |      | **<enum_type>** | "native"                 |
|                     |      | <simple_declarator> |                      |
|                     |      | <constr_forward_decl>                      |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <type_declarator>   | ::=  | **<type_spec> <declarators>**              |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <type_spec>         | ::=  | **<simple_type_spec>** |                   |
|                     |      | **<constr_type_spec>**                     |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <simple_type_spec>  | ::=  | **<base_type_spec>** |                     |
|                     |      | **<template_type_spec>** |                 |
|                     |      | **<scoped_name>**                          |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <base_type_spec>    | ::=  | **<floating_pt_type>** |                   |
|                     |      | **<integer_type>** | **<char_type>** |     |
|                     |      | <wide_char_type> | **<boolean_type>** |    |
|                     |      | **<octet_type>** | <any_type> |            |
|                     |      | <object_type> | <value_base_type>          |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <template_type\     | ::=  | **<sequence_type>** |                      |
| _spec>              |      | **<string_type>** | <wide_string_type> |   |
|                     |      | <fixed_pt_type> | <map_type>               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <constr_type_spec>  | ::=  | **<struct_type>** | **<union_type>** |     |
|                     |      | **<enum_type>**                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <declarators>       | ::=  | **<declarator> { "," <declarator> }***     |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <declarator>        | ::=  | **<simple_declarator>** |                  |
|                     |      | **<complex_declarator>**                   |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <simple_dec\        | ::=  | **<identifier>**                           |
| larator>            |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <complex_dec\       | ::=  | **<array_declarator>**                     |
| larator>            |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <floating_pt\       | ::=  | **"float"** | **"double"** |               |
| _type>              |      | "long" "double"                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <integer_type>      | ::=  | **<signed_int>** | **<unsigned_int>**      |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <signed_int>        | ::=  | **<signed_short_int>** |                   |
|                     |      | **<signed_long_int>** |                    |
|                     |      | **<signed_longlong_int>**                  |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <signed_short_int>  | ::=  | **"short"**                                |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <signed_long_int>   | ::=  | **"long"**                                 |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <signed_long\       | ::=  | **"long" "long"**                          |
| long_int>           |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <unsigned_int>      | ::=  | **<unsigned_short_int>** |                 |
|                     |      | **<unsigned_long_int> |                    |
|                     |      | **<unsigned_longlong_int>**                |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <unsigned_short\    | ::=  | **"unsigned" "short"**                     |
| _int>               |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <unsigned_long\     | ::=  | **"unsigned" "long"**                      |
| _int>               |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <unsigned_long\     | ::=  | **"unsigned" "long" "long"**               |
| long_int>           |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <char_type>         | ::=  | **"char"**                                 |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <wide_char_type>    | ::=  | "wchar"                                    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <boolean_type>      | ::=  | **"boolean"**                              |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <octet_type>        | ::=  | **"octet"**                                |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <any_type>          | ::=  | "any"                                      |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <object_type>       | ::=  | "Object"                                   |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <struct_type>       | ::=  | **<struct_header> "{"                      |
|                     |      | <member_list> "}"**                        |
+---------------------+------+--------------------------------------------+
| <member_list>       | ::=  | **<member>+**                              |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <member>            | ::=  | **<type_spec> <declarators> ";" |          |
|                     |      | <ann_appl> <type_spec> <declarator> ";"    |
|                     |      | <ann_appl_post>**                          |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <union_type>        | ::=  | **<ann_appl> "union" <identifier>          |
|                     |      | "switch" "(" <switch_type_spec> ")"        |
|                     |      | "{" <switch_body> "}"**                    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <switch_type_spec>  | ::=  | **<ann_appl> <switch_type_name>            |
|                     |      | <ann_appl_post>**                          |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <switch_body>       | ::=  | **<case>+**                                |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <case>              | ::=  | **<case_label>+ <element_spec> ";"         |
|                     |      | <ann_appl_post**                           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <case_label>        | ::=  | **"case" <const_exp> ":" |                 |
|                     |      | "default" ":"**                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <element_spec>      | ::=  | **<ann_appl> <type_spec> <declarator>**    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <enum_type>         | ::=  | **<ann_appl> "enum" <identifier> "{"       |
|                     |      | <enumerator> { "," <ann_appl_post>         |
|                     |      | <enumerator> }* <ann_appl_post> "}"**      |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <enumerator>        | ::=  | **<ann_appl> <identifier>**                |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <sequence_type>     | ::=  | **"sequence" "<" <ann_appl>                |
|                     |      | <simple_type_spec> "," <ann_appl_post>     |
|                     |      | <positive_int_const> ">" | "sequence"      |
|                     |      | "<" <ann_appl> <simple_type_spec>          |
|                     |      | <ann_appl_post> ">"**                      |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <string_type>       | ::=  | **"string" "<" <positive_int_const>        |
|                     |      | ">"** | **"string"**                       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <wide_string_type>  | ::=  | "wstring" "<" <positive_int_const>         |
|                     |      | ">" | "wstring"                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <array_declarator>  | ::=  | **<identifier> <ann_appl>                  |
|                     |      | <ann_appl_post> <fixed_array_size>+**      |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <fixed_array_size>  | ::=  | **"[" <positive_int_const> "]"**           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <attr_dcl>          | ::=  | <readonly_attr_spec> | <attr_spec>         |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <except_dcl>        | ::=  | "exception" <identifier> "{"               |
|                     |      | <member>* "}"                              |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <op_dcl>            | ::=  | [ <op_attribute> ] <op_type_spec>          |
|                     |      | <identifier> <parameter_dcls>              |
|                     |      | [ <raises_expr> ] [ <context_expr> ]       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <op_attribute>      | ::=  | "oneway"                                   |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <op_type_spec>      | ::=  | <param_type_spec> | "void"                 |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <parameter_dcls>    | ::=  | "(" <param_dcl> { "," <param_dcl> }*       |
|                     |      | ")" | "(" ")"                              |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <param_dcl>         | ::=  | <param_attribute> <param_type_spec>        |
|                     |      | <simple_declarator>                        |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <param_attribute>   | ::=  | "in" | "out" | "inout"                     |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <raises_expr>       | ::=  | "raises" "(" <scoped_name> { ","           |
|                     |      | <scoped_name> }* ")"                       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <context_expr>      | ::=  | "context" "(" <string_literal> { ","       |
|                     |      | <string_literal> }* ")"                    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <param_type_spec>   | ::=  | <base_type_spec> | <string_type> |         |
|                     |      | <wide_string_type> | <scoped_name>         |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <fixed_pt_type>     | ::=  | "fixed" "<" <positive_int_const> ","       |
|                     |      | <positive_int_const> ">"                   |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <fixed_pt_const\    | ::=  | "fixed"                                    |
| _type>              |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <value_base_type>   | ::=  | "ValueBase"                                |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <constr_forward\    | ::=  | "struct" <identifier> | "union"            |
| _decl>              |      | <identifier>                               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <import>            | ::=  | "import"                                   |
|                     |      | <imported_scope> ";"                       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <imported_scope>    | ::=  | <scoped_name> | <string_literal>           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <type_id_dcl>       | ::=  | "typeid" <scoped_name> <string_literal>    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <type_prefix_dcl>   | ::=  | "typeprefix" <scoped_name>                 |
|                     |      | <string_literal>                           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <readonly_attr\     | ::=  | "readonly" "attribute" <param_type_spec>   |
| _spec>              |      | <readonly_attr_declarator>                 |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <readonly_attr\     | ::=  | <simple_declarator> <raises_expr> |        |
| _declarator>        |      | <simple_declarator> { ","                  |
|                     |      | <simple_declarator> }*                     |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <attr_spec>         | ::=  | "attribute" <param_type_spec>              |
|                     |      | <attr_declarator>                          |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <attr_declarator>   | ::=  | <simple_declarator>                        |
|                     |      | <attr_raises_expr> | <simple_declarator>   |
|                     |      | { "," <simple_declarator> }*               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <attr_raises_expr>  | ::=  | <get_excep_expr> [ <set_excep_expr> ] |    |
|                     |      | <set_excep_expr>                           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <get_excep_expr>    | ::=  | "getraises" <exception_list>               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <set_excep_expr>    | ::=  | "setraises" <exception_list>               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <exception_list>    | ::=  | "(" <scoped_name> { "," <scoped_name>      |
|                     |      | } * ")"                                    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <component>         | ::=  | <component_dcl> |                          |
|                     |      | <component_forward_dcl>                    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <component_for\     | ::=  | "component" <identifier>                   |
| ward_dcl>           |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <component_dcl>     | ::=  | <component_header> "{"                     |
|                     |      | <component_body> "}"                       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <component_header>  | ::=  | "component" <identifier>                   |
|                     |      | [ <component_inheritance_spec> ]           |
|                     |      | [ <supported_interface_spec> ]             |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <supported_in\      | ::=  | "supports" <scoped_name> { ","             |
| terface_spec>       |      | <scoped_name> }*                           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <component_in\      | ::=  | ":" <scoped_name>                          |
| heritance_spec>     |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <component_body>    | ::=  | <component_export>*                        |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <component_export>  | ::=  | <provides_dcl> ";" | <uses_dcl> ";" |      |
|                     |      | <emits_dcl> ";" | <publishes_dcl> ";" |    |
|                     |      | <consumes_dcl> ";" | <attr_dcl> ";"        |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <provides_dcl>      | ::=  | "provides" <interface_type>                |
|                     |      | <identifier>                               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <interface_type>    | ::=  | <scoped_name> | "Object"                   |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <uses_dcl>          | ::=  | "uses" [ "multiple" ] < interface_type>    |
|                     |      | <identifier>                               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <emits_dcl>         | ::=  | "emits" <scoped_name> <identifier>         |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <publishes_dcl>     | ::=  | "publishes" <scoped_name> <identifier>     |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <consumes_dcl>      | ::=  | "consumes" <scoped_name> <identifier>      |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <home_dcl>          | ::=  | <home_header> <home_body>                  |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <home_header>       | ::=  | "home" <identifier> [                      |
|                     |      | <home_inheritance_spec> ] [                |
|                     |      | <supported_interface_spec> ] "manages"     |
|                     |      | <scoped_name> [ <primary_key_spec> ]       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <home_inheri\       | ::=  | ":" <scoped_name>                          |
| tance_spec>         |      |                                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <primary_key_spec>  | ::=  | "primarykey" <scoped_name>                 |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <home_body>         | ::=  | "{" <home_export>* "}"                     |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <home_export>       | ::=  | <export> | <factory_dcl> ";" |             |
|                     |      | <finder_dcl> ";"                           |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <factory_dcl>       | ::=  | "factory" <identifier> "(" [               |
|                     |      | <init_param_decls> ] ")" [                 |
|                     |      | <raises_expr> ]                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <finder_dcl>        | ::=  | "finder" <identifier> "(" [                |
|                     |      | <init_param_decls> ] ")" [                 |
|                     |      | <raises_expr> ]                            |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <event>             | ::=  | (<event_dcl> | <event_abs_dcl> |           |
|                     |      | <event_forward_dcl>)                       |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <event_forward\     | ::=  | [ "abstract" ] "eventtype"                 |
| _dcl>               |      | <identifier>                               |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <event_abs_dcl>     | ::=  | "abstract" "eventtype" <identifier> [      |
|                     |      | <value_inheritance_spec> ] "{"             |
|                     |      | <export>* "}"                              |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <event_dcl>         | ::=  | <event_header> "{" <value_element>* "}"    |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <event_header>      | ::=  | [ "custom" ] "eventtype" <identifier> [    |
|                     |      | <value_inheritance_spec> ]                 |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+
| <identifier>        | ::=  | Arbitrarily long sequence of ASCII         |
|                     |      | alphabetic, numeric and underscore         |
|                     |      | characters. The first character must       |
|                     |      | be ASCII alphabetic. All characters        |
|                     |      | are significant. An identifier may be      |
|                     |      | escaped with a prepended underscore        |
|                     |      | character to prevent collisions with       |
|                     |      | new IDL keywords. The underscore does      |
|                     |      | not appear in the generated output.        |
|                     |      |                                            |
+---------------------+------+--------------------------------------------+


.. EoF
