Object Path BNF

[This is preliminary documentation and subject to change.]

// Object Path BNF
// ================

// The first part of the grammar is the namespace path.

<Parse> ::= BACKSLASH <ns_or_server>;
<Parse> ::= IDENT <ns_or_class>;    // Save initial IDENT, since we don't know what it is
<Parse> ::= COLON <objref>;

// In the case of a server or ns prefix, we allow the objref portion to be missing.

<ns_or_server> ::= BACKSLASH <dot_or_ident> BACKSLASH <ns_list> <optional_objref>;
<ns_or_server> ::= <ns_list> <optional_objref>;                   

<dot_or_ident> ::= IDENT;
<dot_or_ident> ::= DOT;

<optional_objref> ::= COLON <objref>;
<optional_objref> ::= <>;

<ns_or_class> ::= COLON <ident_becomes_ns> <objref>;
<ns_or_class> ::= BACKSLASH <ident_becomes_ns> <ns_list> COLON <objref>;
<ns_or_class> ::= <ident_becomes_class> <objref_rest>;

<ns_list> ::= IDENT <ns_list_rest>;

<ns_list_rest> ::= BACKSLASH <ns_list>;
<ns_list_rest> ::= <>;

<ident_becomes_ns> ::= <>;      // <initial_ident> becomes a namespace
<ident_becomes_class> ::= <>;   // <initial_ident> becomes the class

// The following portion is the object reference within the namespace.

<objref> ::= IDENT <objref_rest>;  // IDENT is classname

<objref_rest> ::= EQUALS <key_const>;
<objref_rest> ::= DOT <keyref_list>;
<objref_rest> ::= <>;

<keyref_list> ::= <keyref> <keyref_term>;

<keyref_term> ::= COMMA <keyref_list>;      // Used for compound keys
<keyref_term> ::= <>;

<keyref> ::= <propname> EQUALS <key_const>;

<propname>  ::= IDENT;

<key_const> ::= STRING_CONST;
<key_const> ::= INTEGRAL_CONST;
<key_const> ::= REAL_CONST;
<key_const> ::= IDENT;      // Where IDENT is "OBJECT" 
                            // This is for singleton classes