The following listing comprises the language specification for UNOIDL in pseudo BNF notation.
<idl_specification> := <definition>+
<definition> := <type_decl> ";"
| <module_decl> ";"
| <constant_decl> ";"
| <exception_decl> ";"
| <constants_decl> ";"
| <service_decl> ";"
| <singleton_decl> ";"
<type_decl> := <interface>
| < constr_type_spec >
| "typedef" <type_spec> <declarator> {"," <declarator> }*
<interface> := <interface_decl>
| <forward_decl>
<forward_decl> := "interface" <identifier>
<interface_decl> := <interface_header> "{" <interface_body> "}"
<interface_header> := "interface" <identifier> [ <interface_inheritance> ]
<interface_inheritance> := ":" <interface_name>
<interface_name> := <scoped_name>
<scoped_name> := <identifier>
| "::" <scoped_name>
| <scoped_name> "::" <identifier>
<interface_body> := <export>+
<export> := <attribute_decl> ";"
| <operation_decl> ";"
<attribute_decl> := <attribute_head> <type_spec> <declarator> { "," <declarator> }*
<attribute_head> := "[" ["readonly" ","] "attribute" "]"
| "[" "attribute" ["," "readonly"] "]"
<declarator> := <identifier>
| <array_declarator>
<array_declarator> := <identifier> <array_size>+
<array_size> := "[" <positive_int> "]"
<positive_int> := <const_expr>
<type_spec> := <simple_type_spec>
| constr_type_spec>
<simple_type_spec> := <base_type_spec>
| <template_type_spec>
| <scoped_name>
<base_type_spec> := <integer_type>
| <floating_point_type>
| <char_type>
| <byte_type>
| <boolean_type>
| <string_type>
| <any_type>
| <type_type>
<template_type> := <sequence_type>
| <array_type>
<sequence_type> := "sequence" "<" <type_spec> ">"
<array_type> := <type_spec> <array_size>+
<floating_point_type> := "float"
| "double"
<integer_type> := <signed_int>
| <unsinged_int>
<signed_int> := "short"
| "long"
| "hyper"
<unsigned_int> := "unsigned" "short"
| "unsigned" "long"
| "unsigned" "hyper"
<char_type> := "char"
<type_type> := "type"
<string_type> := "string"
<byte_type> := "byte"
<any_type> := "any"
<boolean_type> := "boolean"
<constr_type_spec> := <struct_type>
| <enum_type>
| <union_type>
<struct_decl> := "struct" <identifier> [ <struct_inheritance> ] "{" <member>+ "}"
<struct_inheritance> := ":" <scoped_name>
<member> := <type_spec> <declarator> { "," <declarator> }*
enum_decl> := enum <identifier> "{" <enumerator> { "," <enumerator> }* "}"
<enumerator> := <identifier> [ "=" <positive_int> ]
<union_decl> := "union" <identifier> "switch" "(" <switch_type_spec> ")"
"{" <switch_body> "}"
<switch_type_spec> := <integer_type>
| <enum_type>
| <scoped_name>
<switch_body> := <case>+
<case> := <case_label> <element_spec> ";"
<case_label> := "case" <const_expr> ":"
| "default" ":";
<element_spec> := <type_spec> <declarator>
<exception_decl> := "exception" <identifier> [ <exception_inheritance> ] "{" <member>* "}"
<exception_inheritance> := ":" <scoped_name>
<module_decl> := "module" <identifier> "{" <definition>+ "}"
<constant_decl> := "const" <const_type> <identifier> "=" <const_expr>
<const_type> := <integer_type>
| <char_type>
| <boolean_type>
| <floating_point_type>
| <string_type>
| <scoped_name>
<const_expr> := <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_expr> ")"
<literal> := <integer_literal>
| <string_literal>
| <character_literal>
| <floating_point_literal>
| <boolean_literal>
<boolean_literal> := "TRUE"
| "True"
| "FALSE"
| "False"
<service_decl> := "service" <identifier> "{" <service_member>+ "}"
<singleton_decl> := "singleton" <identifier> "{" "service" <declarator> ";" "}"
<service_member> := <property_decl> ";"
| <support_decl> ";"
| <export_decl> ";"
| <observe_decl> ";"
| <needs_decl> ";"
<property_decl> := <property_head> <type_spec> <declarator> { "," <declarator> }*
<property_head> := "[" {<property_flags> ","}* "property" "]"
| "[" "property" {"," <property_flags>}* "]"
<property_flags> := "readonly"
| "bound"
| "constrained"
| "maybeambigious"
| "maybedefault"
| "maybevoid"
| "optional"
| "removable"
| "transient"
<support_decl> := [ "[" "optional" "]" ] "interface" <declarator> { "," <declarator> }*
<export_decl> := [ "[" "optional" "]" ] "service" <declarator> { "," <declarator> }*
<observe_decl> := "observe" <declarator> { "," <declarator> }*
<needs_decl> := "needs" <declarator> { "," <declarator> }*
<constants_decl> := "constants" <identifier> "{" <constant_decl>+ "}"