This topic summarizes IDL syntax, in extended Backus-Naur Format (BNF) notation.
<interface> ::= <interface_header> "{" <interface_body> "}"
<interface_header> ::=
"[" <interface_attributes> "]" "interface" <identifier> [ ":" <identifier> ]
<interface_attributes> ::=
<interface_attribute> [ "," <interface_attribute> ] ...
<interface_attribute> ::= "uuid" "(" <uuid_rep> ")"
| "version" "(" <major> [ "." <minor> ] ")"
| "endpoint" "(" <endpoint_spec> [ "," <endpoint_spec> ] ... ")"
| "pointer_default" "(" <pointer_attribute> ")"
| "local"
| "exceptions" "(" <excep_name> ["," <excep_name>] ... ")"
<excep_name> ::= <Identifier>
<major> ::= <integer>
<minor> ::= <integer>
<endpoint_spec> ::=
""" <family_string> ":" "[" <endpoint_string> "]" """
<family_string> ::= <identifier>
<endpoint_string> ::= <identifier>
<interface_body> ::= [ <import> ] ... [ <export> ] ...
<export> ::= <const_declaration> ";"
| <type_declaration> ";"
| <op_declaration> ";"
<import> ::= import <import_files> ";"
<import_files> ::= <filename> [ "," <filename> ] ... ";"
<filename> ::= """ <character> ... """
<const_declaration> ::=
"const" <const_type_spec> <identifier> "=" <const_exp>
<const_type_spec> ::=
<integer_type> | "char" | "char" "*" | "boolean" | "void" "*"
<const_exp> ::=
<integer_const_exp> | <character_const> | <string_const>
| <identifier> | "TRUE" | "FALSE" | "NULL"
<integer_const_exp> ::= <conditional_exp>
<conditional_exp> ::= <logical_or_exp>
| <logical_or_exp> "?" <integer_const_exp> ":" <conditional_exp>
<logical_or_exp> ::= <logical_and_exp>
| <logical_or_exp> "||" <logical_and_exp>
<logical_and_exp> ::= <inclusive_or_exp>
| <logical_and_exp> "&&" <inclusive_or_exp>
<inclusive_or_exp> ::= <exclusive_or_exp>
| <inclusive_or_exp> "|" <exclusive_or_exp>
<exclusive_or_exp> ::= <and_exp>
| <and_exp> "^" <and_exp>
<and_exp> ::= <equality_exp>
| <and_exp> "&" <equality_exp>
<equality_exp> ::= <relational_exp>
| <equality_exp> "==" <relational_exp>
| <equality_exp> "!=" <relational_exp>
<relational_exp> ::= <shift_exp>
| <relational_exp> "<" <shift_exp>
| <relational_exp> ">" <shift_exp>
| <relational_exp> "<=" <shift_exp>
| <relational_exp> ">=" <shift_exp>
<shift_exp> ::= <additive_exp>
| <shift_exp> "<<" <additive_exp>
| <shift_exp> ">>" <additive_exp>
<additive_exp> ::= <multiplicative_exp>
| <additive_exp> "+" <multiplicative_exp>
| <additive_exp> "-" <multiplicative_exp>
<multiplicative_exp> ::= <unary_exp>
| <multiplicative_exp> "*" <unary_exp>
| <multiplicative_exp> "/" <unary_exp>
| <multiplicative_exp> "%" <unary_exp>
<unary_exp> ::= <primary_exp>
| "+" <primary_exp>
| "-" <primary_exp>
| "~" <primary_exp>
| "!" <primary_exp>
<primary_exp> ::= <integer_literal>
| <identifier>
<character_const> ::= "'" <character> "'"
<string_const> ::= """ [ <character> ] ... """
<type_declaration> ::=
"typedef" [ <type_attributes> ] <type_spec> <declarators>
<type_spec> ::= <simple_type_spec>
| <constructed_type_spec>
<simple_type_spec> ::= <base_type_spec>
| <predefined_type_spec>
| <identifier>
<declarators> ::= <declarator> [ "," <declarator> ] ...
<declarator> ::= <simple_declarator>
| <complex_declarator>
<simple_declarator> ::= <identifier>
<complex_declarator> ::= <array_declarator>
| <function_ptr_declarator>
| <ptr_declarator>
| <ref_declarator>
<ref_declarator> ::= "&" <identifier>
<tagged_declarator> ::= <tagged_struct_declarator>
| <tagged_union_declarator>
<base_type_spec> ::= <integer_type>
| <floating_type>
| <char_type>
| <boolean_type>
| <byte_type>
| <void_type>
| <handle_type>
<floating_type> ::= "float" | "double"
<integer_type> ::= <signed_int> | <unsigned_int>
<signed_int> ::= <int_size> [ "int" ]
<unsigned_int> ::= <int_size> "unsigned" [ "int" ]
| "unsigned" <int_size> [ "int" ]
<int_size> ::= "hyper" | "long" | "short" | "small"
<char_type> ::= [ "unsigned" ] "char"
<boolean_type> ::= "boolean"
<byte_type> ::= "byte"
<void_type> ::= "void"
<handle_type> ::= "handle_t"
<constructed_type_spec> ::= <struct_type>
| <union_type>
| <tagged_declarator>
| <enumeration_type>
| <pipe_type>
<tagged_struct_declarator> ::= "struct" <tag>
| <tagged_struct>
<struct_type> ::= "struct" "{" <member_list> "}"
<tagged_struct> ::= "struct" <tag> "{" <member_list> "}"
<tag> ::= <identifier>
<member_list> ::= <member> [ <member> ] ...
<member> ::= <field_declarator> ";"
<field_declarator> ::= [ <field_attribute_list> ]
<type_spec> <declarators>
<field_attribute_list> ::= "[" <field_attribute> [ ","
<field_attribute>] ... "]"
<tagged_union_declarator> ::= "union" <tag>
| <tagged_union>
<union_type> ::= "union" <union_switch> "{" <union_body> "}"
| "union" "{" <union_body_n_e> "}"
<union_switch> ::= "switch" "(" <switch_type_spec> <identifier> ")"
[ <union_name> ]
.ne 6
<switch_type_spec> ::= <integer_type>
| <char_type>
| <boolean_type>
| <enumeration_type>
<tagged_union_declarator> ::= "union" <tag>
| <tagged_union>
<union_type> ::= "union" <union_switch> "{" <union_body> "}"
| "union" "{" <union_body_n_e> "}"
<union_switch> ::= "switch" "(" <switch_type_spec> <Identifier> ")" \\
[ <union_name> ]
<switch_type_spec> ::= <primitive_integer_type>
| <char_type>
| <boolean_type>
| <enumeration_type>
<tagged_union> ::= "union" <tag> <union_switch> "{" <union_body> "}"
| "union" <tag> "{" <union_body_n_e> "}"
<union_name> ::= <Identifier>
<union_body> ::= <union_case> [ <union_case> ] ...
<union_body_n_e> ::= <union_case_n_e> [ <union_case_n_e> ] ...
<union_case> ::= <union_case_label> [ <union_case_label> ] ... <union_arm>
| <default_case>
<union_case_n_e> ::= <union_case_label_n_e> <union_arm>
| <default_case_n_e>
<union_case_label> ::= "case" <const_exp> ":"
<union_case_label_n_e> ::= "[" "case" "(" <const_exp> \\
[ , <const_exp>] ...")" "]"
<default_case> ::= "default" ":" <union_arm>
<default_case_n_e> ::= "[" "default" "]" <union_arm>
<union_arm> ::= [ <field_declarator> ] ";"
<union_type_switch_attr> ::= "switch_type" "(" <switch_type_spec> ")"
<union_instance_switch_attr> ::= "switch_is" "(" <attr_var> ")"
<enumeration_type> ::=
."enum" "{" <enum_identifier> [ "," <enum_identifier> ] ... "}"
<enum_identifier> ::= <identifier> [ "=" <const_exp> ]
<pipe_type> ::= "pipe" <type_spec> <pipe_declarators>
<array_declarator> ::= <identifier> <array_bounds_list>
<array_bounds_list> ::= <array_bounds_declarator>
[ <array_bounds_declarator> ] ...
<array_bounds_declarator> ::= "[" [ <array_bound> ] "]"
| "[" <array_bounds_pair> "]"
<array_bounds_pair> ::= <array_bound> ".." <array_bound>
<array_bound> ::= "*"
| <integer_literal>
| <identifier>
<type_attribute> ::= "transmit_as" "(" <xmit_type> ")"
| "handle"
| <usage_attribute>
| <union_type_switch_attr>
| <ptr_attr>
<usage_attribute> ::= "string"
| "context_handle"
<xmit_type> ::= <simple_type_spec>
<field_attribute> ::= "first_is" "(" <attr_var_list> ")"
| "last_is" "(" <attr_var_list> ")"
| "length_is" "(" <attr_var_list> ")"
| "max_is" "(" <attr_var_list> ")"
| "min_is" "(" <attr_var_list> ")"
| "size_is" "(" <attr_var_list> ")"
| <usage_attribute>
| <union_instance_switch_attr>
| "ignore"
| <ptr_attr>
<attr_var_list> ::= <attr_var> [ "," <attr_var> ] ...
<attr_var> ::= [ ["*"]<identifier> ]
<ptr_declarator> ::= "*"<identifier>
<ptr_attr> ::= "ref"
| "unique"
| "full"
<op_declarator> ::= [ <operation_attributes> ]
<simple_type_spec> <identifier> <parameter_declarators>
<operation_attributes> ::= "[" <operation_attribute> [ "static" ]
[ "," <operation_attribute> ] ... "]"
<operation_attribute> ::= "idempotent"
| "broadcast"
| "maybe"
| "reflect_deletions"
| <usage_attribute>
| <ptr_attr>
<param_declarators> ::= "(" "void" ")"
| "(" [ <param_declarator> [ "," <param_declarator> ] ... ] ")"
<param_declarator> ::= <param_attributes> <type_spec> <declarator>
<param_attributes> ::=
"[" <param_attribute> [ "," <param_attribute> ] ... "]"
<param_attribute> ::= <directional_attribute>
| <field_attribute>
<directional_attribute> ::= "in" [ "(" "shape" ")" ]
| "out" [ "(" "shape" ")" ]
<function_ptr_declarator> ::= <simple_type_spec>
"(" "*"<identifier> ")" <param_declarators>
<predefined_type_spec> ::= "error_status_t"
| <international_character_type>
<international_character_type> ::= ISO_LATIN_1
| ISO_MULTI_LINGUAL
| ISO_UCS
<pipe_declarators> ::= <pipe_declarator> [ "," <pipe_declarator> ] ...
<pipe_declarator> ::= <simple_declarator>
| <ptr_declarator>
| <ref_declarator>