Appendix A
IL Assembler Grammar Reference
Lexical Tokens
ID
C-style
DOTTEDNAME
Composite dot-separated
QSTRING C-style quoted string (e.g., "hi\n")
SQSTRING C-style single-quoted string (e.g., 'hi')
INT64 C-style 64 bit integer (e.g., -2353453636235234, 0x34FFFFFFFFFF)
FLOAT64 C-style floating point number (e.g., -0.2323, 354.3423, 3435.34E-5)
HEXBYTE Two-digit unsigned hexadecimal number (e.g., 0A, F4)
INSTR_* IL instructions of a particular kind
Data Type Nonterminals
<compQstring> ::= QSTRING ”‚ <compQstring> + QSTRING <int32> ::= INT64 <int64> ::= INT64 <float64> ::= FLOAT64 ”‚ float32 ( <int32> ) ”‚ float64 ( <int64> ) <bytes> ::= /* EMPTY */ ”‚ <hexbytes> <hexbytes> ::= HEXBYTE ”‚ <hexbytes> HEXBYTE <truefalse> ::= true ”‚ false
Identifier Nonterminals
<id> ::= ID ”‚ SQSTRING <compName> ::= <id> ”‚ DOTTEDNAME ”‚ <compName> . <compName>
Module-Level Declarations
<PROGRAM> ::= <decls> <decls> ::= /* EMPTY */ ”‚ <decls> <decl> <decl> ::= <classHead> { <classDecls> } ”‚ <nameSpaceHead> { <decls> } ”‚ <methodHead> <methodDecls> } ”‚ <fieldDecl> ”‚ <dataDecl> ”‚ <vtfixupDecl> ”‚ <fileDecl> ”‚ <assemblyHead> { <assemblyDecls> } ”‚ <assemblyRefHead> { <assemblyRefDecls> } ”‚ <expTypeHead> { <expTypeDecls> } ”‚ <manifestResHead> { <manifestResDecls> } ”‚ <moduleHead> ”‚ <secDecl> ”‚ <customAttrDecl> ”‚ .subsystem <int32> ”‚ .corflags <int32> ”‚ .file alignment <int32> ”‚ .imagebase <int64> ”‚ <extSourceSpec> ”‚ <languageDecl>
External Source Declarations
<extSourceSpec> ::= .line <int32> SQSTRING ”‚ .line <int32> ”‚ .line <int32> : <int32> SQSTRING ”‚ .line <int32> : <int32> <languageDecl> ::= .language SQSTRING ”‚ .language SQSTRING,SQSTRING ”‚ .language SQSTRING,SQSTRING,SQSTRING
V-Table
<vtfixupDecl> ::= .vtfixup [ <int32> ] <vtfixupAttr> at <id> <vtfixupAttr> ::= /* EMPTY */ ”‚ <vtfixupAttr> int32 ”‚ <vtfixupAttr> int64 ”‚ <vtfixupAttr> fromunmanaged ”‚ <vtfixupAttr> callmostderived
Namespace and Type Declarations
<nameSpaceHead> ::= .namespace <compName> <classHead> ::= .class <classAttrs> <id> <extendsClause> <implClause> <classAttrs> ::= /* EMPTY */ ”‚ <classAttrs> <classAttr> <classAttr> ::= <classAttr> public ”‚ <classAttr> private ”‚ <classAttr> nested public ”‚ <classAttr> nested private ”‚ <classAttr> nested family ”‚ <classAttr> nested assembly ”‚ <classAttr> nested famandassem ”‚ <classAttr> nested famorassem ”‚ <classAttr> value ”‚ <classAttr> enum ”‚ <classAttr> interface ”‚ <classAttr> sealed ”‚ <classAttr> abstract ”‚ <classAttr> auto ”‚ <classAttr> sequential ”‚ <classAttr> explicit ”‚ <classAttr> ansi ”‚ <classAttr> unicode ”‚ <classAttr> autochar ”‚ <classAttr> import ”‚ <classAttr> serializable ”‚ <classAttr> beforefieldinit ”‚ <classAttr> specialname ”‚ <classAttr> rtspecialname <extendsClause> ::= /* EMPTY */ ”‚ extends <classRef> <implClause> ::= /* EMPTY */ ”‚ implements <classRefs> <classRefs> ::= <classRefs> , <classRef> ”‚ <classRef> <classRef> ::= [ <compName> ] <slashedName> ”‚ [ .module <compName> ] <slashedName> ”‚ <slashedName> <slashedName> ::= <compName> ”‚ <slashedName> / <compName> <classDecls> ::= /* EMPTY */ ”‚ <classDecls> <classDecl> <classDecl> ::= <methodHead> <methodDecls> } ”‚ <classHead> { <classDecls> } ”‚ <eventHead> { <eventDecls> } ”‚ <propHead> { <propDecls> } ”‚ <fieldDecl> ”‚ <dataDecl> ”‚ <secDecl> ”‚ <extSourceSpec> ”‚ <customAttrDecl> ”‚ .size <int32> ”‚ .pack <int32> ”‚ .override <typeSpec> :: <methodName> with <callConv> <type> <typeSpec> :: <methodName> ( <sigArgs> ) ”‚ <languageDecl>