8 Appendix C: Full ABNF

 start-rule = 
       *( interface / import / export / oa-scope / oa-dispinterface )
  
 ; Automation scope
 oa-scope = oa-library-header LWSP "{" oa-library-body "}" LWSP [";"]
 oa-library-header = 
     "[" LWSP library-attributes LWSP "]" LWSP kw-library LWSP 
     Identifier
 oa-library-body = *oa-library-declarator
  
 library-attributes = 
     library-attribute *( "," LWSP library-attribute LWSP )
 library-attribute = uuid-attr / 
     version-attr / 
     lcid-attr / 
     help-attr / 
     custom-attr / 
     kw-control / 
     kw-hidden / 
     kw-restricted
  
 uuid-attr = kw-uuid LWSP "(" LWSP uuid-rep LWSP ")"
  
 version-attr = 
     kw-version LWSP "(" LWSP 1*DIGIT *( "." 1*DIGIT ) LWSP ")"
  
 lcid-attr = kw-lcid LWSP "(" LWSP integer-const-exp LWSP ")"
  
 help-attr = helpcontext-attr / 
     helpfile-attr / 
     helpstring-attr / 
     helpstringcontext-attr / 
     helpstringdll-attr
 helpcontext-attr = 
     kw-helpcontext LWSP "(" LWSP integer-const-exp LWSP ")"
 helpfile-attr = kw-helpfile LWSP "(" LWSP string LWSP ")"
 helpstring-attr = kw-helpstring LWSP "(" LWSP string LWSP ")"
 helpstringcontext-attr = 
     kw-helpstringcontext LWSP "(" LWSP integer-const-exp LWSP ")"
 helpstringdll-attr = kw-helpstringdll LWSP "(" LWSP string LWSP ")"
  
 custom-attr = 
     kw-custom LWSP "(" uuid-rep LWSP "," LWSP const-exp LWSP ")"
  
 oa-library-declarator = interface / 
     import / 
     export / 
     oa-importlib / 
     oa-module / 
     oa-dispinterface / 
     oa-coclass
  
 type-attribute = rpcidl-defined / 
     uuid-attr / 
     help-attr / 
     custom-attr / 
     kw-public / 
     kw-restricted
  
 ; Automation Compatible Types
 oa-type-spec = oa-base-type-spec / 
     oa-safearray-type-spec / 
     oa-ptr-type-spec / 
     Identifier
  
 oa-base-type-spec = oa-base-nondecimal-type-spec / kw-Decimal
  
 oa-base-nondecimal-type-spec = kw-boolean / 
     [kw-unsigned] LWSP kw-char / 
     [kw-unsigned] LWSP kw-short / 
     [kw-unsigned] LWSP kw-int / 
     [kw-unsigned] LWSP kw-long / 
     kw-double / 
     kw-float / 
     kw-BSTR / 
     kw-CURRENCY / 
     kw-DATE / 
     kw-SCODE
     
 oa-safearray-type-spec = 
     kw-SAFEARRAY "(" oa-base-nondecimal-type-spec ")" / 
     kw-SAFEARRAY "(" oa-ptr-type-spec ")" / 
     kw-SAFEARRAY "(" Identifier ")"
  
 oa-ptr-type-spec = oa-base-nondecimal-type-spec "*" / 
     oa-safearray-type-spec "*" / 
     Identifier "*"
  
 ; Automation Interfaces
 interface-attribute = rpcidl-defined / 
     attr-oleautomation / 
     attr-dual / 
     kw-nonextensible / 
     kw-proxy / 
     custom-attr
  
 attr-oleautomation = kw-oleautomation
 attr-dual = kw-dual
  
 oa-dispinterface = 
     oa-dispitf-header LWSP "{" LWSP oa-dispitf-body LWSP "}"
 oa-dispitf-header = "[" interface-attributes "]" 
     LWSP kw-dispinterface LWSP Identifier
 oa-dispitf-body = oa-itf-ref / oa-odl-body
 oa-itf-ref = kw-interface LWSP Identifier LWSP ";"
  
 ; Automation Members
 operation-attribute = rpcidl-defined / 
     kw-id LWSP "(" LWSP integer-const-exp LWSP ")" / 
     kw-propget / 
     kw-propput / 
     kw-propputref / 
     kw-vararg / 
     kw-defaultcollelem / 
     kw-nonbrowsable / 
     kw-replaceable / 
     kw-restricted / 
     kw-uidefault / 
     kw-hidden / 
     oa-bindable-attr / 
     readonly-attr / 
     help-attr / 
     custom-attr
  
 oa-bindable-attr = kw-bindable / 
     kw-immediatebind / 
     kw-defaultbind / 
     kw-displaybind / 
     kw-requestedit
  
 oa-odl-body = 
     kw-properties LWSP ":" LWSP *oa-odl-prop LWSP 
     kw-methods LWSP ":" LWSP *oa-odl-method
 oa-odl-prop = 
     *( operation-attributes ) LWSP oa-type-spec LWSP 
     Identifier LWSP ";"
 oa-odl-method = op-declarator
 readonly-attr = kw-readonly
     
 ; Automation Parameters
 param-attribute = rpcidl-defined / 
     kw-defaultvalue LWSP "("   LWSP const-exp LWSP ")" / 
     kw-optional / 
     kw-lcid / 
     kw-retval / 
     custom-attr
  
 oa-coclass = "[" LWSP oa-coclass-attrs LWSP "]" LWSP 
       kw-coclass LWSP Identifier 
       LWSP "{" LWSP oa-coclass-body LWSP "}"
  
 oa-coclass-attrs = oa-coclass-attr *( LWSP ","  LWSP 
                    oa-coclass-attr)
 oa-coclass-attr = uuid-attr / 
     help-attr / 
     version-attr / 
     custom-attr / 
     kw-aggregatable / 
     kw-appobject / 
     kw-control / 
     kw-hidden / 
     kw-licensed / 
     kw-noncreatable / 
     kw-predeclid
  
 oa-coclass-body = *( oa-coclass-itf-decl )
 oa-coclass-itf-decl = [ "[" LWSP oa-cid-attrs LWSP "]" LWSP ] 
       ( kw-interface / kw-dispinterface ) LWSP Identifier LWSP ";"
 oa-cid-attrs = oa-cid-attr *( LWSP "," LWSP oa-cid-attr )
 oa-cid-attr = kw-source / 
     kw-default / 
     kw-defaultvtable / 
     kw-restricted
  
 oa-module = [ "[" LWSP oa-module-attrs  LWSP "]"  LWSP ] 
       kw-module LWSP Identifier LWSP 
       "{" oa-module-body "}"
  
 oa-module-attrs = oa-module-attr *( LWSP "," LWSP oa-module-attr )
 oa-module-attr = uuid-attr / 
     version-attr / 
     help-attr / 
     kw-dllname LWSP "(" LWSP string LWSP ")" / 
     kw-hidden
  
 oa-module-body = *( oa-const-stmt / oa-mmethod-stmt )
 oa-const-stmt = [ "[" LWSP *( help-attr ) LWSP "]" LWSP ] 
       ( kw-const / kw-static ) LWSP 
       oa-base-type-spec LWSP Identifier LWSP 
       "=" LWSP const-exp LWSP ";"
  
 oa-mmethod-stmt = [ "[" LWSP oa-mmethod-attrs LWSP "]" LWSP ] 
       oa-type-spec LWSP [ oa-mmethod-cc LWSP ] 
       Identifier LWSP param-declarators LWSP ";"
 oa-mmethod-attrs = oa-mmethod-attr *( LWSP "," LWSP oa-mmethod-attr )
 oa-mmethod-attr = 
     kw-entry LWSP "(" LWSP oa-entry-id LWSP ")" / 
     kw-propget / 
     kw-propput / 
     kw-propputref / 
     kw-usesgetlasterror / 
     kw-vararg / 
     help-attr
  
 oa-entry-id = string / integer-const-exp
 oa-mmethod-cc = kw-cdecl / 
     kw-stdcall / 
     kw-pascal
  
 oa-importlib = kw-importlib LWSP "(" LWSP string LWSP ")" LWSP ";"
  
 ; Automation keywords: case sensitive
 kw-aggregatable = %d97.103.103.114.101.103.97.116.97.98.108.101
 kw-appobject = %d97.112.112.111.98.106.101.99.116
 kw-bindable = %d98.105.110.100.97.98.108.101
 kw-boolean = %d98.111.111.108.101.97.110
 kw-BSTR = %d66.83.84.82
 kw-cdecl = %d99.100.101.99.108
 kw-char = %d99.104.97.114
 kw-coclass = %d99.111.99.108.97.115.115
 kw-const = %d99.111.110.115.116
 kw-control = %d99.111.110.116.114.111.108
 kw-CURRENCY = %d67.85.82.82.69.78.67.89
 kw-custom = %d99.117.115.116.111.109
 kw-DATE = %d68.65.84.69
 kw-Decimal = %d68.101.99.105.109.97.108
 kw-default = %d100.101.102.97.117.108.116
 kw-defaultbind = %d100.101.102.97.117.108.116.98.105.110.100
 kw-defaultcollelem = 
     %d100.101.102.97.117.108.116.99.111.108.108.101.108.101.109
 kw-defaultvalue = 
     %d100.101.102.97.117.108.116.118.97.108.117.101
 kw-defaultvtable = 
     %d100.101.102.97.117.108.116.118.116.97.98.108.101
 kw-dispinterface = 
     %d100.105.115.112.105.110.116.101.114.102.97.99.101
 kw-displaybind = 
     %d100.105.115.112.108.97.121.98.105.110.100
 kw-dllname = %d100.108.108.110.97.109.101
 kw-double = %d100.111.117.98.108.101
 kw-dual = %d100.117.97.108
 kw-entry = %d101.110.116.114.121
 kw-float = %d102.108.111.97.116
 kw-helpcontext = %d104.101.108.112.99.111.110.116.101.120.116
 kw-helpfile = %d104.101.108.112.102.105.108.101
 kw-helpstring = %d104.101.108.112.115.116.114.105.110.103
 kw-helpstringcontext = 
    %d104.101.108.112.115.116.114.105.110.103.99.111.110.116.101.120.116
 kw-helpstringdll = 
     %d104.101.108.112.115.116.114.105.110.103.100.108.108
 kw-hidden = %d104.105.100.100.101.110
 kw-id = %d105.100
 kw-immediatebind = 
    %d105.109.109.101.100.105.97.116.101.98.105.110.100
 kw-importlib = %d105.109.112.111.114.116.108.105.98
 kw-int = %d105.110.116
 kw-interface = %d105.110.116.101.114.102.97.99.101
 kw-lcid = %d108.99.105.100
 kw-library = %d108.105.98.114.97.114.121
 kw-licensed = %d108.105.99.101.110.115.101.100
 kw-long = %d108.111.110.103
 kw-methods = %d109.101.116.104.111.100.115
 kw-module = %d109.111.100.117.108.101
 kw-nonbrowsable = %d110.111.110.98.114.111.119.115.97.98.108.101
 kw-noncreatable = %d110.111.110.99.114.101.97.116.97.98.108.101
 kw-nonextensible = 
     %d110.111.110.101.120.116.101.110.115.105.98.108.101
 kw-oleautomation = 
     %d111.108.101.97.117.116.111.109.97.116.105.111.110
 kw-optional = %d111.112.116.105.111.110.97.108
 kw-pascal = %d112.97.115.99.97.108
 kw-predeclid = %d112.114.101.100.101.99.108.105.100
 kw-properties = %d112.114.111.112.101.114.116.105.101.115
 kw-propget = %d112.114.111.112.103.101.116
 kw-propput = %d112.114.111.112.112.117.116
 kw-propputref = %d112.114.111.112.112.117.116.114.101.102
 kw-proxy = %d112.114.111.120.121
 kw-public = %d112.117.98.108.105.99
 kw-readonly = %d114.101.97.100.111.110.108.121
 kw-replaceable = %d114.101.112.108.97.99.101.97.98.108.101
 kw-requestedit = %d114.101.113.117.101.115.116.101.100.105.116
 kw-restricted = %d114.101.115.116.114.105.99.116.101.100
 kw-retval = %d114.101.116.118.97.108
 kw-SAFEARRAY = %d83.65.70.69.65.82.82.65.89
 kw-SCODE = %d83.67.79.68.69
 kw-short = %d115.104.111.114.116
 kw-source = %d115.111.117.114.99.101
 kw-static = %d115.116.97.116.105.99
 kw-stdcall = %d115.116.100.99.97.108.108
 kw-uidefault = %d117.105.100.101.102.97.117.108.116
 kw-unsigned = %d117.110.115.105.103.110.101.100
 kw-uuid = %d117.117.105.100
 kw-usesgetlasterror = 
   %d117.115.101.115.103.101.116.108.97.115.116.101.114.114.111.114
 kw-vararg = %d118.97.114.97.114.103
 kw-version = %d118.101.114.115.105.111.110
  
 ; Rules defined in the [C706] IDL specification
 uuid-rep = rpcidl-defined
 string = rpcidl-defined
 const-exp = rpcidl-defined
 integer-const-exp = rpcidl-defined
 operation-attributes = rpcidl-defined
 op-declarator = rpcidl-defined
 interface-attributes = rpcidl-defined
 interface = rpcidl-defined
 import = rpcidl-defined
 export = rpcidl-defined
 param-declarators = rpcidl-defined
 Identifier = rpcidl-defined
  
 rpcidl-defined = "already defined"
  
 ;Tokens
  
  
 ; The ABNF Core rules
 ALPHA = %x41-5A / %x61-7A   ; A-Z / a-z
 BIT = "0" / "1"
 CHAR = %x01-7F
     ; any 7-bit US-ASCII character,
     ;  excluding NUL
 CR = %x0D
     ; carriage return
 CRLF = CR LF
     ; Internet standard newline
 CTL = %x00-1F / %x7F
     ; controls
 DIGIT = %x30-39
     ; 0-9
 DQUOTE = %x22
     ; " (Double Quote)
 HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
 HTAB = %x09
     ; horizontal tab
 LF = %x0A
     ; linefeed
 LWSP = *(WSP / CRLF WSP)
     ; linear white space (past newline)
 OCTET = %x00-FF
     ; 8 bits of data
 SP = %x20
 VCHAR = %x21-7E
     ; visible (printing) characters
 WSP = SP / HTAB
     ; white space