Поделиться через


Грамматика BNF средства сборки макросов Майкрософт

Эта страница содержит описание грамматики MASM BNF. Он предоставляется в качестве дополнения к ссылке и не гарантируется, что он будет завершен. Ознакомьтесь со ссылкой на полные сведения о ключевых словах, параметрах, операциях и т. д.

Чтобы проиллюстрировать использование BNF, на следующей схеме показано определение TYPEDEF директивы, начиная с нетерминального typedefDir.

Диаграмма, показывающая иерархию терминалов и нетерминальных объектов, которые создают типdefDir.

Записи под каждой горизонтальной фигурной скобкой являются терминалами, такими как NEAR16, NEAR32, FAR16и FAR32. Кроме того, они нетерминалы, такие как qualifier, qualifiedTypedistanceи protoSpec которые могут быть определены далее. Каждый курсив, нетерминальный в typedefDir определении, также является записью в BNF. Три вертикальные точки указывают определение ветвления для нетерминального, что, ради простоты, эта цифра не иллюстрирует.

Грамматика BNF позволяет рекурсивным определениям. Например, грамматика используется qualifiedType как возможное определениеqualifiedType, которое также является компонентом определения.qualifier Символ "|" задает выбор между альтернативными выражениями, например endOfLine | comment. Двойные скобки указывают необязательный параметр, например ⟦ macroParmList ⟧. Скобки на самом деле не отображаются в исходном коде.

MASM Nonterminals

;;
endOfLine | comment

=Dir
id = immExpr ;;

addOp
+ | -

aExpr
term | aExpr && term

altId
id

alpha
  Любая верхняя или строчная буква (A-Z) или одна из этих четырех символов: @ _ $ ?

arbitraryText
charList

asmInstruction
mnemonicexprList ⟦ ⟧

assumeDir
ASSUME assumeList ;;
  | ASSUME NOTHING ;;

assumeList
assumeRegister | assumeList , assumeRegister

assumeReg
register : assumeVal

assumeRegister
assumeSegReg | assumeReg

assumeSegReg
segmentRegister : assumeSegVal

assumeSegVal
frameExpr | NOTHING | ERROR

assumeVal
qualifiedType | NOTHING | ERROR

bcdConst
sign ⟦ ⟧decNumber

binaryOp
== | != | >= | <= | > | < | &

bitDef
bitFieldId: bitFieldSize = constExpr ⟦ ⟧

bitDefList
bitDef | bitDefList, ;; ⟦ ⟧bitDef

bitFieldId
id

bitFieldSize
constExpr

blockStatements
directiveList
  | .CONTINUE.IF cExpr ⟦ ⟧
  | .BREAK.IF cExpr ⟦ ⟧

bool
TRUE | FALSE

byteRegister
AL | AH | CL | CH | DL | DH | BL | BH | R8B | R9B | R10B | R11B | R12B | R13B | R14B | R15B

cExpr
aExpr | cExpr || aExpr

character
  Любой символ с порядком в диапазоне 0–255, кроме линии (10).

charList
character | charList character

className
string

commDecl
nearfar ⟦ ⟧ ⟦ langTypeid : commType
: constExpr ⟦ ⟧

commDir
COMM
commList ;;

comment
; text ;;

commentDir
COMMENT delimiter
text
text delimiter text ;;

commList
commDecl | commList , commDecl

commType
type | constExpr

constant
digitsradixOverride ⟦ ⟧

constExpr
expr

contextDir
PUSHCONTEXT contextItemList ;;
  | POPCONTEXT contextItemList ;;

contextItem
ASSUMES | RADIX | LISTING | CPU | ALL

contextItemList
contextItem | contextItemList , contextItem

controlBlock
whileBlock | repeatBlock

controlDir
controlIf | controlBlock

controlElseif
.ELSEIF cExpr ;;
directiveList
controlElseif ⟦ ⟧

controlIf
.IF cExpr ;;
directiveList
controlElseif ⟦ ⟧
.ELSE;;
directiveList
.ENDIF ;;

coprocessor
.8087 | .287 | .387 | .NO87

crefDir
crefOption ;;

crefOption
.CREF
  | .XCREFidList ⟦ ⟧
  | .NOCREFidList ⟦ ⟧

cxzExpr
expr
  | ! expr
  | expr == expr
  | expr != expr

dataDecl
DB | DW | DD | DF | DQ | DT | dataType | typeId

dataDir
id ⟦ ⟧ dataItem ;;

dataItem
dataDecl scalarInstList
  | structTag structInstList
  | typeId structInstList
  | unionTag structInstList
  | recordTag recordInstList

dataType
BYTE | SBYTE | WORD | SWORD | DWORD | SDWORD | FWORD | QWORD | SQWORD | TBYTE | OWORD | REAL4 | REAL8 | REAL10 | MMWORD | XMMWORD | YMMWORD

decdigit
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

decNumber
decdigit
  | decNumber decdigit

delimiter
  Любой символ, кроме whiteSpaceCharacter

digits
decdigit
  | digits decdigit
  | digits hexdigit

directive
generalDir | segmentDef

directiveList
directive | directiveList directive

distance
nearfar | NEAR16 | NEAR32 | FAR16 | FAR32

e01
e01 orOp e02 | e02

e02
e02 AND e03 | e03

e03
NOT e04 | e04

e04
e04 relOp e05 | e05

e05
e05 addOp e06 | e06

e06
e06 mulOp e07 | e06 shiftOp e07 | e07

e07
e07 addOp e08 | e08

e08
HIGH e09
  | LOW e09
  | HIGHWORD e09
  | LOWWORD e09
  | e09

e09
OFFSET e10
  | SEG e10
  | LROFFSET e10
  | TYPE e10
  | THIS e10
  | e09 PTR e10
  | e09 : e10
  | e10

e10
e10 . e11
  | e10expr ⟦ ⟧
  | e11

e11
( expr )
  | expr ⟦ ⟧
  | WIDTH id
  | MASK id
  | SIZE sizeArg
  | SIZEOF sizeArg
  | LENGTH id
  | LENGTHOF id
  | recordConst
  | string
  | constant
  | type
  | id
  | $
  | segmentRegister
  | register
  | ST
  | ST ( expr )

echoDir
ECHO arbitraryText ;;
%OUT arbitraryText ;;

elseifBlock
elseifStatement ;;
directiveList
elseifBlock ⟦ ⟧

elseifStatement
ELSEIF constExpr
  | ELSEIFE constExpr
  | ELSEIFB textItem
  | ELSEIFNB textItem
  | ELSEIFDEF id
  | ELSEIFNDEF id
  | ELSEIFDIF textItem , textItem
  | ELSEIFDIFI textItem , textItem
  | ELSEIFIDN textItem , textItem
  | ELSEIFIDNI textItem , textItem
  | ELSEIF1
  | ELSEIF2

endDir
ENDimmExpr ⟦ ⟧;;

endpDir
procId ENDP ;;

endsDir
id ENDS ;;

equDir
textMacroId EQU equType ;;

equType
immExpr | textLiteral

errorDir
errorOpt ;;

errorOpt
.ERRtextItem ⟦ ⟧
  | .ERREconstExpr optText ⟦ ⟧
  | .ERRNZconstExpr optText ⟦ ⟧
  | .ERRBtextItem optText ⟦ ⟧
  | .ERRNBtextItem optText ⟦ ⟧
  | .ERRDEFid optText ⟦ ⟧
  | .ERRNDEFid optText ⟦ ⟧
  | .ERRDIFtextItem , textItem optText ⟦ ⟧
  | .ERRDIFItextItem , textItem optText ⟦ ⟧
  | .ERRIDNtextItem , textItem optText ⟦ ⟧
  | .ERRIDNItextItem , textItem optText ⟦ ⟧
  | .ERR1textItem ⟦ ⟧
  | .ERR2textItem ⟦ ⟧

exitDir
.EXITexpr ⟦ ⟧;;

exitmDir
: EXITM | EXITM textItem

exponent
Esign ⟦ ⟧decNumber

expr
SHORT e05
  | .TYPE e01
  | OPATTR e01
  | e01

exprList
expr | exprList , expr

externDef
langType id ⟦ ⟧ ⟦ ( altId ): externType

externDir
externKey externList ;;

externKey
EXTRN | EXTERN | EXTERNDEF

externList
externDef | externList, ;; ⟦ ⟧externDef

externType
ABS | qualifiedType

fieldAlign
constExpr

fieldInit
initValue ⟦ ⟧ |structInstance

fieldInitList
fieldInit | fieldInitList, ;; ⟦ ⟧fieldInit

fileChar
delimiter

fileCharList
fileChar | fileCharList fileChar

fileSpec
fileCharList | textLiteral

flagName
ZERO? | CARRY? | OVERFLOW? | SIGN? | PARITY?

floatNumber
sign decNumber . ⟦ ⟧ ⟦ decNumber ⟧ ⟦ ⟧ exponent
  | digits R
  | digits r

forcDir
FORC | IRPC

forDir
FOR | IRP

forParm
id: forParmType ⟦ ⟧

forParmType
REQ | = textLiteral

fpuRegister
ST expr

frameExpr
SEG id
  | DGROUP : id
  | segmentRegister : id
  | id

generalDir
modelDir | segOrderDir | nameDir
  | includeLibDir | commentDir
  | groupDir | assumeDir
  | structDir | recordDir | typedefDir
  | externDir | publicDir | commDir | protoTypeDir
  | equDir | =Dir | textDir
  | contextDir | optionDir | processorDir
  | radixDir
  | titleDir | pageDir | listDir
  | crefDir | echoDir
  | ifDir | errorDir | includeDir
  | macroDir | macroCall | macroRepeat | purgeDir
  | macroWhile | macroFor | macroForc
  | aliasDir

gpRegister
AX | EAX | CX | ECX | DX | EDX | BX | EBX
  | DI | EDI | SI | ESI | BP | EBP | SP | ESP
  | R8W | R8D | R9W | R9D | R12D | R13W | R13D | R14W | R14D

groupDir
groupId GROUP segIdList

groupId
id

hexdigit
a | b | c | d | e | f
  | A | B | C | D | E | F

id
alpha
  | id alpha
  | id decdigit
  Максимальная длина — 247 символов.

idList
id | idList , id

ifDir
ifStatement ;;
directiveList
elseifBlock ⟦ ⟧
ELSE;;
directiveList;;

ifStatement
IF constExpr
  | IFE constExpr
  | IFB textItem
  | IFNB textItem
  | IFDEF id
  | IFNDEF id
  | IFDIF textItem , textItem
  | IFDIFI textItem , textItem
  | IFIDN textItem , textItem
  | IFIDNI textItem , textItem
  | IF1
  | IF2

immExpr
expr

includeDir
INCLUDE fileSpec ;;

includeLibDir
INCLUDELIB fileSpec ;;

initValue
immExpr
  | string
  | ?
  | constExpr DUP ( scalarInstList )
  | floatNumber
  | bcdConst

inSegDir
labelDef ⟦ ⟧inSegmentDir

inSegDirList
inSegDir | inSegDirList inSegDir

inSegmentDir
instruction
  | dataDir
  | controlDir
  | startupDir
  | exitDir
  | offsetDir
  | labelDir
  | procDirlocalDirList ⟦ ⟧ ⟦ inSegDirListendpDir
  | invokeDir
  | generalDir

instrPrefix
REP | REPE | REPZ | REPNE | REPNZ | LOCK

instruction
instrPrefix ⟦ ⟧asmInstruction

invokeArg
register :: register
  | expr
  | ADDR expr

invokeDir
INVOKEexpr , ;; ⟦ ⟦ ⟧ invokeList;;

invokeList
invokeArg | invokeList, ;; ⟦ ⟧invokeArg

keyword
  Любое зарезервированное слово.

keywordList
keyword | keyword keywordList

labelDef
id : | id :: | @@:

labelDir
id LABEL qualifiedType ;;

langType
C | PASCAL | FORTRAN | BASIC | SYSCALL | STDCALL

listDir
listOption ;;

listOption
.LIST
  | .NOLIST
  | .XLIST
  | .LISTALL
  | .LISTIF
  | .LFCOND
  | .NOLISTIF
  | .SFCOND
  | .TFCOND
  | .LISTMACROALL | .LALL
  | .NOLISTMACRO | .SALL
  | .LISTMACRO | .XALL

localDef
LOCAL idList ;;

localDir
LOCAL parmList ;;

localDirList
localDir | localDirList localDir

localList
localDef | localList localDef

macroArg
% constExpr
  | % textMacroId
  | % macroFuncId ( macroArgList )
  | string
  | arbitraryText
  | < arbitraryText >

macroArgList
macroArg | macroArgList , macroArg

macroBody
localList ⟦ ⟧macroStmtList

macroCall
id macroArgList ;;
  | id ( macroArgList )

macroDir
idMACRO macroParmList ⟦ ⟧;;
macroBody
ENDM ;;

macroFor
forDir forParm , < macroArgList > ;;
macroBody
ENDM ;;

macroForc
forcDir id , textLiteral ;;
macroBody
ENDM ;;

macroFuncId
id

macroId
macroProcId | macroFuncId

macroIdList
macroId | macroIdList , macroId

macroLabel
id

macroParm
id: parmType ⟦ ⟧

macroParmList
macroParm | macroParmList, ;; ⟦ ⟧macroParm

macroProcId
id

macroRepeat
repeatDir constExpr ;;
macroBody
ENDM ;;

macroStmt
directive
  | exitmDir
  | : macroLabel
  | GOTO macroLabel

macroStmtList
macroStmt ;;
  | macroStmtList macroStmt ;;

macroWhile
WHILE constExpr ;;
macroBody
ENDM ;;

mapType
ALL | NONE | NOTPUBLIC

memOption
TINY | SMALL | MEDIUM | COMPACT | LARGE | HUGE | FLAT

mnemonic
  Имя инструкции.

modelDir
.MODELmemOption , modelOptlist⟦ ⟧;;

modelOpt
langType | stackOption

modelOptlist
modelOpt | modelOptlist , modelOpt

module
directiveList ⟦ ⟧endDir

mulOp
* | / | MOD

nameDir
NAME id ;;

nearfar
NEAR | FAR

nestedStruct
structHdrid ⟦ ⟧;;
structBody
ENDS ;;

offsetDir
offsetDirType ;;

offsetDirType
EVEN
  | ORG immExpr
  | ALIGNconstExpr ⟦ ⟧

offsetType
GROUP | SEGMENT | FLAT

oldRecordFieldList
constExpr ⟦ ⟧ | oldRecordFieldList , ⟦ ⟧ constExpr

optionDir
OPTION optionList ;;

optionItem
CASEMAP : mapType
  | DOTNAME | NODOTNAME
  | EMULATOR | NOEMULATOR
  | EPILOGUE : macroId
  | EXPR16 | EXPR32
  | LANGUAGE : langType
  | LJMP | NOLJMP
  | M510 | NOM510
  | NOKEYWORD : < keywordList >
  | NOSIGNEXTEND
  | OFFSET : offsetType
  | OLDMACROS | NOOLDMACROS
  | OLDSTRUCTS | NOOLDSTRUCTS
  | PROC : oVisibility
  | PROLOGUE : macroId
  | READONLY | NOREADONLY
  | SCOPED | NOSCOPED
  | SEGMENT : segSize
  | SETIF2 : bool

optionList
optionItem | optionList, ;; ⟦ ⟧optionItem

optText
, textItem

orOp
OR | XOR

oVisibility
PUBLIC | PRIVATE | EXPORT

pageDir
PAGEpageExpr ⟦ ⟧;;

pageExpr
+ | pageLength ⟦ ⟧ ⟦ , pageWidth

pageLength
constExpr

pageWidth
constExpr

parm
parmId: qualifiedType ⟦ ⟧
  | parmIdconstExpr ⟦ ⟧ ⟦ : qualifiedType

parmId
id

parmList
parm | parmList, ;; ⟦ ⟧parm

parmType
REQ | = textLiteral | VARARG

pOptions
distance ⟦ ⟧ ⟦ langType ⟧ ⟦ ⟧ oVisibility

primary
expr binaryOp expr | flagName | expr

procDir
procIdPROC pOptions ⟦ ⟧ ⟦ < macroArgList >
usesRegs ⟦ ⟧ ⟦ procParmList

processor
  | .386 | .386p | .486 | .486P
  | .586 | .586P | .686 | .686P | .387

processorDir
processor ;;
  | coprocessor ;;

procId
id

procItem
instrPrefix | dataDir | labelDir | offsetDir | generalDir

procParmList
, ;; ⟦ ⟦ ⟧ parmList
, ;; ⟦ ⟦ ⟧ parmId :VARARG

protoArg
id ⟦ ⟧ : qualifiedType

protoArgList
, ;; ⟦ ⟦ ⟧ protoList
, ;; ⟦ ⟦ ⟧ ⟦ ⟧ id:VARARG

protoList
protoArg
  | protoList, ;; ⟦ ⟧protoArg

protoSpec
distance ⟦ ⟧ ⟦ langType ⟧ ⟦ ⟧ protoArgList
  | typeId

protoTypeDir
id PROTO protoSpec

pubDef
langType ⟦ ⟧id

publicDir
PUBLIC pubList ;;

pubList
pubDef | pubList, ;; ⟦ ⟧pubDef

purgeDir
PURGE macroIdList

qualifiedType
type
  | distance PTR ⟦ ⟧ ⟦ qualifiedType

qualifier
qualifiedType | PROTO protoSpec

quote
" | '

qwordRegister
RAX | RCX | RDX | RBX | RSP | RBP | RSI | RDI
  | R8 | R9 | R10 | R11 | R12 | R13 | R14 | R15

radixDir
.RADIX constExpr ;;

radixOverride
h | o | q | t | y
  | H | O | Q | T | Y

recordConst
recordTag { oldRecordFieldList }
  | recordTag < oldRecordFieldList >

recordDir
recordTag RECORD bitDefList ;;

recordFieldList
constExpr ⟦ ⟧ | recordFieldList ,;; ⟧ ⟦ ⟧ constExpr

recordInstance
{;; recordFieldList ⟦ ⟧ ⟦ ;;}
  | < oldRecordFieldList >
  | constExpr DUP ( recordInstance )

recordInstList
recordInstance | recordInstList, ;; ⟦ ⟧recordInstance

recordTag
id

register
specialRegister | gpRegister | byteRegister | qwordRegister | fpuRegister | SIMDRegister | segmentRegister

regList
register | regList register

relOp
EQ | NE | LT | LE | GT | GE

repeatBlock
.REPEAT ;;
blockStatements ;;untilDir ;;

repeatDir
REPEAT | REPT

scalarInstList
initValue
  | scalarInstList, ;; ⟦ ⟧initValue

segAlign
BYTE | WORD | DWORD | PARA | PAGE

segAttrib
PUBLIC | STACK | COMMON | MEMORY | AT constExpr | PRIVATE

segDir
.CODEsegId ⟦ ⟧
  | .DATA
  | .DATA?
  | .CONST
  | .FARDATAsegId ⟦ ⟧
  | .FARDATA?segId ⟦ ⟧
  | .STACKconstExpr ⟦ ⟧

segId
id

segIdList
segId
  | segIdList , segId

segmentDef
segmentDirinSegDirList endsDirsimpleSegDir | ⟦ ⟧ ⟦ inSegDirList ⟧ ⟦ ⟧ endsDir

segmentDir
segIdSEGMENT segOptionList ⟦ ⟧;;

segmentRegister
CS | DS | ES | FS | GS | SS

segOption
segAlign
  | segRO
  | segAttrib
  | segSize
  | className

segOptionList
segOption | segOptionList segOption

segOrderDir
.ALPHA | .SEQ | .DOSSEG | DOSSEG

segRO
READONLY

segSize
USE16 | USE32 | FLAT

shiftOp
SHR | SHL

sign
+ | -

simdRegister
MM0 | MM1 | MM2 | MM3 | MM4 | MM5 | MM6 | MM7
  | xmmRegister
  | YMM0 | YMM1 | YMM2 | YMM3 | YMM4 | YMM5 | YMM6 | YMM7
  | YMM8 | YMM9 | YMM10 | YMM11 | YMM12 | YMM13 | YMM14 | YMM15

simpleExpr
( cExpr ) | primary

simpleSegDir
segDir ;;

sizeArg
id | type | e10

specialChars
: | . | [ | ] | ( | ) | < | > | { | }
  | + | - | / | * | & | % | !
  | ' | \ | = | ; | , | "
  | whiteSpaceCharacter
  | endOfLine

specialRegister
CR0 | CR2 | CR3
  | DR0 | DR1 | DR2 | DR3 | DR6 | DR7
  | TR3 | TR4 | TR5 | TR6 | TR7

stackOption
NEARSTACK | FARSTACK

startupDir
.STARTUP ;;

stext
stringChar | stext stringChar

string
quotestext ⟦ ⟧quote

stringChar
quotequote | Любой символ, кроме кавычки.

structBody
structItem ;;
  | structBody structItem ;;

structDir
structTagstructHdr fieldAlign ⟦ ⟧
, NONUNIQUE ⟦ ⟧;;
structBody
structTag ENDS ;;

structHdr
STRUC | STRUCT | UNION

structInstance
<fieldInitList ⟦ ⟧>
  | {;; ⟦ ⟧ ⟦ fieldInitList ⟧ ⟦ ⟧ ;;}
  | constExprDUP ( structInstList )

structInstList
structInstance | structInstList, ;; ⟦ ⟧structInstance

structItem
dataDir
  | generalDir
  | offsetDir
  | nestedStruct

structTag
id

term
simpleExpr | ! simpleExpr

text
textLiteral | text character | ! character text | character | ! character

textDir
id textMacroDir ;;

textItem
textLiteral | textMacroId | % constExpr

textLen
constExpr

textList
textItem | textList, ;; ⟦ ⟧textItem

textLiteral
< text > ;;

textMacroDir
CATSTRtextList ⟦ ⟧
  | TEXTEQUtextList ⟦ ⟧
  | SIZESTR textItem
  | SUBSTRtextItem , textStart , textLen ⟦ ⟧
  | INSTRtextStart , ⟦ ⟧ textItem , textItem

textMacroId
id

textStart
constExpr

titleDir
titleType arbitraryText ;;

titleType
TITLE | SUBTITLE | SUBTTL

type
structTag
  | unionTag
  | recordTag
  | distance
  | dataType
  | typeId

typedefDir
typeId TYPEDEF qualifier

typeId
id

unionTag
id

untilDir
.UNTIL cExpr ;;
.UNTILCXZcxzExpr ⟦ ⟧;;

usesRegs
USES regList

whileBlock
.WHILE cExpr ;;
blockStatements ;;
.ENDW

whiteSpaceCharacter
  ASCII 8, 9, 11–13, 26, 32

xmmRegister
XMM0 | XMM1 | XMM2 | XMM3 | XMM4 | XMM5 | XMM6 | XMM7
  | XMM8 | XMM9 | XMM10 | XMM11 | XMM12 | XMM13 | XMM14 | XMM15