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