词法标记:如下所示:
1.ID:C风格的字符和数字混合的标识符(例如,Hello_There2)。
2.DOTTEDNAME:复合的以句点分割的名称(例如,System.Object)。
3.QSTRING:C风格的双引号字符串(例如,“hi\n”)。
4.SQSTRING:C风格的单引号字符串(例如,‘hi’)。
5.INT32:C风格的32位整数(例如,235,03423,0x34FFF)。
6.INT64:C风格的64位整数(例如,-2353453636235234,0x34FFFFFFFFFF)。
7.FLOAT64:C风格的浮点数(例如,-0.2323,354.3423,3435.34E-5)。
8.INSTR_*:特殊类的IL指令(参见opcode.def指令)。
9.HEXBYTE:1位或者2位十六进制数字(例如,A2,F0)。
10.ILASM关键字都以粗体显示(例如,.class,valuetype,marshal)。
11.注释包括在/* */对中(例如,/* this is a comment */)。
辅助词法标记:如下所示:
1.TYPEDEF_T:类的别名(TypeDef或TypeRef)。
2.TYPEDEF_M:方法的别名。
3.TYPEDEF_F:字段的别名。
4.TYPEDEF_TS:类型说明的别名(TypeSpec)。
5.TYPEDEF_MR:字段或方法的别名(MemberRef)。
6.TYPEDEF_CA:自定义特性的别名。
数据类型非终结符:如下所示:
1.compQstring ::= QSTRING | compQstring + QSTRING
2.int32 ::= INT64
3.int64 ::= INT64
4.float64 ::= FLOAT64 | float32(int32) | float64(int64)
5.bytes ::= /* EMPTY */ | hexbytes
6.hexbytes ::= HEXBYTE | hexbytes HEXBYTE
7.truefalse ::= true | false
8.mdtoken ::= mdtoken(int32)
标识符非终结符:如下所示:
1.id ::= ID | SQSTRING
2.dottedName ::= id | DOTTEDNAME | dottedName.dottedName
3.slashedName ::= dottedName | slashedName / dottedName
类引用:如下所示:
1.className ::= [ dottedName ] slashedName
| [ mdtoken ] slashedName
| [ * ] slashedName
| [ .module dottedName ] slashedName
| slashedName
| mdtoken
| TYPEDEF_T
| .this
| .base
| .nester
2.classNameSeq ::= /* EMPTY */ | className classNameSeq
模块级声明:如下所示:
1.PROGRAM :: = decls
2.decls := /* EMPTY */ | decls decl
3.decl ::= moduleParamDecl
| manifestDecl
| classHead { classDecls }
| .namespace dottedName { decls } /* 废弃的 */
| methodHead methodDecls }
| fieldDecl
| dataDecl
| extSourceSpec
| secDecl
| customAttrDecl
| languageDecl
| typedefDecl
| compControl
编译控制伪指令:如下所示:
1.compControl ::= #define dottedName
| #define dottedName QSTRING
| #undef dottedName
| #ifdef dottedName
| #else
| #endif
| #include QSTRING
| ;
模板参数声明:如下所示:
1.moduleParamDecl ::= .subsystem int32
| .corflags int32
| .file alignment int32
| .imagebase int64
| .stackreserve int64
| .typelist { classNameSeq }
| .mscorlib
| vtableDecl /* 不建议使用;替代的使用.vtfixup */
| vtfixupDecl
V表定位表声明:如下所示:
1.vtfixupDecl ::= .vtfixup [ int32 ] vtfixupAttr at id
2.vtfixupAttr ::= /* EMPTY */
| vtfixupAttr int32
| vtfixupAttr int64
| vtfixupAttr fromunmanaged
| vtfixupAttr callmostderived /* 不使用 /
| vtfixupAttr retainappdomain / 不使用 /
3.vtableDecl ::= .vtable = ( bytes ) / 不建议使用;替代的使用.vtfixup */
清单声明:如下所示:
1.manifestDecl ::= .module
| .module dottedName
| .module extern dottedName
| assemblyHead { assemblyDecls }
| assemblyRefHead { assemblyRefDecls }
| fileDecl
| exptypeHead {exptypeDecls}
| manifestResHead { manifestResDecls}
| moduleHead
2.assemblyHead ::= .assembly asmAttr dottedName
3.asmAttr ::= /* EMPTY */
| asmAttr retargetable
| asmAttr legacy library /* 只是为了向后兼容 */
| asmAttr cil
| asmAttr x86
| asmAttr ia64
| asmAttr amd64
4.assemblyDecls ::= /* EMPTY */
| assemblyDecls assemblyDecl
5.assemblyDecl ::= .hash algorithm int32
| secDecl
| asmOrRefDecl
6.intOrWildcard ::= int32 | *
7.asmOrRefDecl ::= .publickey = ( bytes )
| .ver intOrWildcard : intOrWildcard : intOrWildcard : intOrWildcard
| .locale compQstring
| .locale = ( bytes )
| customAttrDecl
| compControl
8.assemblyRefHead ::= .assembly extern asmAttr dottedName
| .assembly extern asmAttr dottedName as dottedName
9.assemblyRefDecls ::= /* EMPTY */
| assemblyRefDecls assemblyRefDecl
10.assemblyRefDecl ::= .hash = ( bytes )
| asmOrRefDecl
| .publickeytoken = ( bytes )
| auto
11.fileDecl ::= .file fileAttr dottedName fileEntry .hash = (bytes) fileEntry
| .file fileAttr dottedName fileEntry
12.fileAttr ::= /* EMPTY */
| fileAttr nometadata
13.fileEntry ::= /* EMPTY */
| .entrypoint
14.exptypeHead ::= .class extern expAttr dottedName
15.expAttr := /* EMPTY */
| expAttr private
| expAttr public
| expAttr forwarder
| expAttr nested public
| expAttr nested private
| expAttr nested family
| expAttr nested assembly
| expAttr nested famandassem
| expAttr nested famorassem