自己按照龙书做的。
已经有的功能:
1.整形变量声明
2.赋值

效果如下:


INCLUDE Irvine32.incParseTableEntryCount=12
;==================== DATA =======================
.data
sourceCode byte "int adfcx_2324;int intsasdas;int intsasdas1;intsasdas1=123;intsasdas=121;adfcx_2324=122;"
state byte 0                    ;lexana的状态
sourceCodePointer dword 0   ;指向源代码的指针  分析lexical用
symbolTable byte 200 dup(0)     ;字符表    每个表项占10个字节 当前每个表项只存两个成员 各占一个字节 1:id名字地址 2:id变量地址
token byte 0                    ;当前解析出来的lex是啥   ;1:;, 2:int,3:id,4:结束符,5:数字常量
tempIDNameBuffer byte 20 dup(0) ;临时存放id名字用的  在分析lex中用到
tempIDNameBufferPointer byte 0  ;指向tempIDNameBuffer的指针
symbolTableCount byte 0         ;当前symbolTable表项的数量
IDNameBuffer byte 200 dup(0)    ;存放id名字用的
IDNameBufferPointer byte 0      ;存放id名字用的表的指针
parseTable dword 300 dup(2)     ;解析表
shift byte "shift ",0
reduce byte "reduce ",0
accp byte "accpt",0
entry word  0
sr word 0                       ;是shift还是reduce?
value word 0                    ;解析表中对应的值
pStack dword 300 dup(0)         ;解析栈
pStackTop dword 0               ;栈顶指针
action dword 0
staCo word 0
staNum byte "the number of state is ",0
iMediate byte "interMediateTable",0
declare byte "declare ",0
interMediateTable byte 300 dup(0)       ;中间语言表
interMediateTableCount dword 0          ;中间语言表数量
symbolTableText byte 200 dup (0)        ;把symbol存到目标文本中
idbufferText byte 900 dup(0)            ;把idbuffer存到目标文本中
filename byte "output.txt",0
fileHandle DWORD ?
bytesWritten Dword ?
bufSize Dword ?
alloc byte 0                            ;id变量位置
dlc byte 30H                                ;id名字标号
initCodeText byte "mov eax,initValue",0ah,"mov dword ptr[data1+",0,0,"h],eax",0ah,"inc initValue",0ah
codeBegin byte "INCLUDE Irvine32.inc",0ah,".code",0ah,"main PROC",0ah,0
codeMedia byte "call iterSymbolTable",0ah,"exit",0ah,"main ENDP",0ah,"iterSymbolTable PROC",0ah,"mov esi,offset e0",0ah,"mov eax,0",0ah
codeMedia1 byte "movzx ecx,idco",0ah,"mov ebx,10",0ah,"l1:",0ah,"push eax",0ah,"mov ebx,10",0ah,"mul ebx",0ah
codeMedia2 byte "movzx ebx,byte ptr[esi+eax+0]",0ah,"mov edx,offset d0",0ah,"add edx,ebx",0ah,"call writeString",0ah
codeMedia3 byte "push eax",0ah,"mov eax,20h",0ah,"call writeChar",0ah,"pop eax",0ah,"movzx ebx,byte ptr[esi+eax+1]",0ah,"mov eax,dword ptr[data1+ebx]",0ah,"call writeDec",0ah,"call crlf",0ah
codeMedia4 byte "pop eax",0ah,"inc eax",0ah,"loop l1",0ah,"ret",0ah,"iterSymbolTable ENDP",0ah,".data",0ah,"data1 byte 200 dup(0)",0ah,"initValue dword 0",0ah,0
codeEnd byte 0ah,"END main",0ah,0
codeMeida5 byte "mov bl,",0,0,"h",0ah
codeMeida6 byte "mov [data1+",0,0,"h],bl",0ah,0ah,0ah
number dword 0
isNewId byte 0      ;是新的吗?
idLoc byte 0        ;不是新的话Id的位置
idloc1 byte 0       ;在reduce时候用
.codemain PROC
;设置parseTable
call setParseTable
mov eax,0
mov ebx,1
call iterParseTableEntry
mov eax,5
mov ebx,0
call iterParseTableEntry
mov eax,6
mov ebx,1
call iterParseTableEntry
mov eax,0
mov [pStack],eax
call LexAnaparse:
mov ecx,pStackTop
inc ecx
mov eax,pStackTop
ll:
push eax
mov ebx,4
mul ebx
mov ebx,eaxpush eax
mov eax,0
mov al,byte ptr[pStack+ebx]
call writeDec
pop eax
pop eax
dec eax
loop ll
call crlf
movzx eax,idloc
mov eax,pStackTopmov ebx,4
mul ebx
mov bl,byte ptr[pStack+eax]
mov eax,ebx                         ;获取当前栈顶元素
movzx ebx,tokencall iterParseTableEntry
mov dx,sr
mov cx,value
cmp sr,0                            ;shift?
je shif
cmp sr,1                            ;reduce?
je reduc
cmp sr,3                            ;acc?
je ql1
shif:
call pushToStack
call LexAna
movzx eax,token
cmp eax,4
jne comp3
call strToNum
comp3:cmp eax,3         ;如果是id加入paserTable中
jne conLoop
push ecx
call addSymbolTableEntry
pop ecx
conLoop:
jmp parsereduc:
cmp value,3
je r3
cmp value,2
je r2
cmp value,0
je r0
cmp value,1
je r1r2:mov ecx,1                   ;reduce T->int
mov action,6
call pushGoto
mov byte ptr[pStack+ebx+1],1      ;标记当前是整形
jmp parse
r1:mov eax,pStackTop
sub eax,1
mov ebx,4
mul ebx
mov bl,byte ptr[pStack+eax+1]
mov ecx,ebx                         ;获取当前栈顶下面一个元素 id在symbolTable的位置;添加interMediate表项
mov eax,interMediateTableCount
mov ebx,3
mul ebx
mov byte ptr[interMediateTable+eax],1          ;1代表声明变量操作
mov byte ptr[interMediateTable+eax+1],cl      ;操作数在SymbolTablE中的位置
inc interMediateTableCount
mov ecx,3                   ;reduce s->T id;
mov action,7
call pushGoto
inc staCo
jmp parse
r0:mov ecx,2
mov action,7
call pushGoto
jmp parser3:mov eax,pStackTop
sub eax,1
mov ebx,4
mul ebx
mov ebx,0
mov bl,byte ptr[pStack+eax+1]
mov number,ebx
mov bl,byte ptr[number]
mov eax,pStackTop
sub eax,3
mov ebx,4
mul ebx
mov bl,byte ptr[pStack+eax+1]
mov idloc1,blmov eax,interMediateTableCount
mov ebx,3
mul ebx
mov byte ptr[interMediateTable+eax],2          ;2代表声明赋值操作
mov bl,idloc1
mov byte ptr[interMediateTable+eax+1],bl      ;id在symbo表中的位置
mov bl,byte ptr[number]
mov byte ptr[interMediateTable+eax+2],bl      ;操作数
inc interMediateTableCountmov ecx,4
mov action,7
call pushGoto
jmp parse
ql1:
mov edx,offset staNum
call writeString
movzx eax,staCo
call writeDec
call crlf
;call lookIDNameBuffer
;call iterSymbolTable
mov edx,offset declare
call writeString
INVOKE CreateFile,ADDR filename,GENERIC_WRITE,DO_NOT_SHARE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov fileHandle,eax
call handleInterMediateTable
call addMediaText
call crlf
call WriteText
call addEndText
exit
main ENDP
strToNum PROC
mov number,0
pushad
mov esi,0
movzx ecx,tempIDNameBufferPointer
dec ecx
l1:
push ecx
mov eax,1
l2:mov ebx,10
mul ebx
loop l2
call WriteDec
movzx ebx,[tempIDNameBuffer+esi]
sub ebx,30h
mul ebx
add number,eax
inc esi
pop ecx
loop l1
movzx ebx,[tempIDNameBuffer+esi]
sub ebx,30h
add number,ebxmov eax,number
call crlf
call WriteDec
call crlf
popad
ret
strToNum ENDP
addEndText PROC
mov bufSize,lengthof codeEnd
INVOKE WriteFile,fileHandle,ADDR codeEnd,bufSize,ADDR bytesWritten,0
INVOKE CloseHandle,fileHandle
ret
addEndText endp
;把中间那块代码放入到文本中
addMediaText PROC
mov bufsize,lengthof codeMedia
INVOKE WriteFile,fileHandle,ADDR codeMedia,bufSize,ADDR bytesWritten,0
mov bufsize,lengthof codeMedia1
INVOKE WriteFile,fileHandle,ADDR codeMedia1,bufSize,ADDR bytesWritten,0
mov bufsize,lengthof codeMedia2
INVOKE WriteFile,fileHandle,ADDR codeMedia2,bufSize,ADDR bytesWritten,0
mov bufsize,lengthof codeMedia3
INVOKE WriteFile,fileHandle,ADDR codeMedia3,bufSize,ADDR bytesWritten,0
mov bufsize,lengthof codeMedia4
dec bufsize
INVOKE WriteFile,fileHandle,ADDR codeMedia4,bufSize,ADDR bytesWritten,0ret
addMediaText ENDP
addEL PROC
dec esi
mov al,0ah
mov [symbolTableText+esi],al
inc esimov al,65h
mov [symbolTableText+esi],al
inc esi
mov al,dlc
inc dlc
mov [symbolTableText+esi],al
inc esi
mov al,20h
mov [symbolTableText+esi],al
inc esi
mov al,62h
mov [symbolTableText+esi],al
inc esi
mov al,79h
mov [symbolTableText+esi],al
inc esi
mov al,74h
mov [symbolTableText+esi],al
inc esi
mov al,65h
mov [symbolTableText+esi],al
inc esi
mov al,20h
mov [symbolTableText+esi],al
inc esi
ret
addEL ENDP
;把symbolTable和idbuffer写入到文本中 方便调试
WriteText PROC
movzx ecx,symbolTableCount
mov esi,0mov al,69h
mov [symbolTableText+esi],al
inc esi
mov al,64h
mov [symbolTableText+esi],al
inc esi
mov al,63h
mov [symbolTableText+esi],al
inc esi
mov al,6fh
mov [symbolTableText+esi],al
inc esi
mov al,20h
mov [symbolTableText+esi],al
inc esi
mov al,62h
mov [symbolTableText+esi],al
inc esi
mov al,79h
mov [symbolTableText+esi],al
inc esi
mov al,74h
mov [symbolTableText+esi],al
inc esi
mov al,65h
mov [symbolTableText+esi],al
inc esi
mov al,20h
mov [symbolTableText+esi],al
inc esi
movzx eax,symbolTableCount
mov edx,16
div dl
inc edx
add al,48
cmp ah,0Ah
jge af2
add ah,48
jmp ssw2
af2:
add ah,55
ssw2:mov [symbolTableText+esi],al
mov [symbolTableText+esi+1],ah
add esi,3l1:
call addEL
mov eax,ecx
push ecx
sub eax,1
mov ecx,10
mov edx,0
mov ebx,10
mul ebx
mov ebx,eax
l2:
movzx eax,byte ptr[symbolTable+ebx+edx]
push edx
mov edx,16
div dl
pop edx
inc edx
add al,48
cmp ah,0Ah
jge af1
add ah,48
jmp ssw1
af1:
add ah,55
ssw1:
mov [symbolTableText+esi],al
mov [symbolTableText+esi+1],ah
mov al,68h
mov [symbolTableText+esi+2],al
mov al,2ch
mov [symbolTableText+esi+3],al
add esi,4
loop l2
pop ecxloop l1dec esi
mov bufSize,esi
INVOKE WriteFile,fileHandle,ADDR symbolTableText,bufSize,ADDR bytesWritten,0
mov ecx,0
mov ebx,0
mov esi,0
mov dlc,30h
mov al,0ah
mov [idbufferText+esi],al
inc esi
mov al,64h
mov [idbufferText+esi],al
inc esi
mov al,dlc
inc dlc
mov [idbufferText+esi],al
inc esi
mov al,20h
mov [idbufferText+esi],al
inc esi
mov al,62h
mov [idbufferText+esi],al
inc esi
mov al,79h
mov [idbufferText+esi],al
inc esi
mov al,74h
mov [idbufferText+esi],al
inc esi
mov al,65h
mov [idbufferText+esi],al
inc esi
mov al,20h
mov [idbufferText+esi],al
inc esi
l3:
movzx eax,byte ptr[IDNameBuffer+ebx]mov edx,16
div dladd al,48
cmp ah,0Ah
jge af
add ah,48
jmp ssw
af:
add ah,55
ssw:
mov [idbufferText+esi],al
inc esi
mov [idbufferText+esi],ah
inc esi
mov al,68h
mov [idbufferText+esi],al
inc esi
mov al,2ch
mov [idbufferText+esi],al
inc esi
movzx eax,byte ptr[IDNameBuffer+ebx]cmp al,0
jne con
inc ecx
cmp cl,symbolTableCount
je qu
dec esi
mov al,0ah
mov [idbufferText+esi],al
inc esimov al,64h
mov [idbufferText+esi],al
inc esi
mov al,dlc
inc dlc
mov [idbufferText+esi],al
inc esi
mov al,20h
mov [idbufferText+esi],al
inc esi
mov al,62h
mov [idbufferText+esi],al
inc esi
mov al,79h
mov [idbufferText+esi],al
inc esi
mov al,74h
mov [idbufferText+esi],al
inc esi
mov al,65h
mov [idbufferText+esi],al
inc esi
mov al,20h
mov [idbufferText+esi],al
inc esi
con:inc ebxjmp l3qu:
dec esi
mov bufSize,esi
INVOKE WriteFile,fileHandle,ADDR idbufferText,bufSize,ADDR bytesWritten,0ret
WriteText ENDPhandleInitCodeText PROC
pushad
mov eax,0
mov al,dl
mov edx,16
div dl
add al,48
cmp ah,0Ah
jge af
add ah,48
jmp ssw
af:
add ah,55
ssw:
mov [initCodeText+38],al
mov [initCodeText+39],ah
mov bufsize,61
INVOKE WriteFile,fileHandle,ADDR initCodeText,bufSize,ADDR bytesWritten,0
popad
ret
handleInitCodeText ENDP
isAssign PROC
pushad
cmp [interMediateTable+ebx],2      ;是声明吗
jne qu
movzx eax,byte ptr[interMediateTable+ebx+1]       ;取出位置
mov bl,byte ptr[interMediateTable+ebx+2]
mov byte ptr[number],bl
mov ebx,10
mul ebx
mov bl,byte ptr[symbolTable+eax+1]
mov idloc,bl
call handleAssignCodeText
qu:
popad
ret
isAssign ENDP
;处理中间表的
handleInterMediateTable PROC
mov bufSize,lengthof codeBegin
dec bufsize
INVOKE WriteFile,fileHandle,ADDR codeBegin,bufSize,ADDR bytesWritten,0mov ecx,interMediateTableCount
mov eax,0
l1:push eax
mov ebx,3
mul ebx
mov ebx,eaxcall isAssignl2:cmp [interMediateTable+ebx],1       ;是声明吗
jne con
mov edx,offset declare
call writeString
mov eax,0
movzx eax,byte ptr[interMediateTable+ebx+1]       ;是取出位置
mov ebx,10
mul ebx
movzx ebx,byte ptr[symbolTable+eax]
mov dl,alloc
mov [symbolTable+eax+1],dl
call handleInitCodeTextadd alloc,4
mov edx,offset IDNameBuffer
add edx,ebx
call writeString
call crlf
con:
pop eax
inc eax
loop l1
ret
handleInterMediateTable ENDPhandleAssignCodeText PROC
pushadmov eax,0
mov al,byte ptr[number]
mov edx,16
div dl
add al,48
cmp ah,0Ah
jge af
add ah,48
jmp ssw
af:
add ah,55
ssw:
mov [codeMeida5+7],al
mov [codeMeida5+8],ah
mov bufsize,11
INVOKE WriteFile,fileHandle,ADDR codeMeida5,bufSize,ADDR bytesWritten,0mov eax,0
mov al,idloc
mov edx,16
div dl
add al,48
cmp ah,0Ah
jge af1
add ah,48
jmp ssw1
af1:
add ah,55
ssw1:
mov [codeMeida6+11],al
mov [codeMeida6+12],ah
mov bufsize,19
INVOKE WriteFile,fileHandle,ADDR codeMeida6,bufSize,ADDR bytesWritten,0
popad
ret
handleAssignCodeText ENDP
pushToStack PROCinc pStackTop
mov eax,pStackTop
mov ebx,4
mul ebx
mov ebx,eaxmovzx eax,value
mov [pStack+ebx],eax
cmp eax,9                   ;是id嘛
jne l3
mov eax,0
mov eax,number
mov byte ptr[pStack+ebx+1],all3:
cmp eax,7                   ;是id===?吗
jne l2
mov eax,0
mov al,idLoc
mov byte ptr[pStack+ebx+1],all2:
cmp eax,5                   ;是id嘛
jne l1
mov eax,0
mov al,symbolTableCount
sub al,1
mov byte ptr[pStack+ebx+1],al
l1:
ret
pushToStack ENDPpushGoto PROC
l1:
dec pStackTop
loop l1
mov eax,pStackTop
mov ebx,4
mul ebx
mov ebx,eax
mov eax,0
mov al,byte ptr[pStack+ebx]        ;当前栈顶元素
mov ebx,action
call iterParseTableEntry
inc pStackTop
mov eax,pStackTop
mov ebx,4
mul ebx
mov ebx,eax
movzx eax,value
mov byte ptr[pStack+ebx],al                ;后面那三个byte根据不同的item 填不同的值
ret
pushGoto ENDP
;查看parseTable表项
iterParseTableEntry PROC
push eax
mov eax,ebx
mov ebx,4
mul ebx
mov ebx,eax
pop eax
mov ecx,0
mov edx,0
mov si,32
mul si
mov esi,offset parseTable
add eax,ebx
mov cx,word ptr[esi+eax]
mov dx,word ptr[esi+eax+2]
mov value,dx
cmp cx,0
je shif
cmp cx,1
je redu
cmp cx,3
je acc
redu:
mov edx,offset reduce
mov byte ptr[sr],1
jmp pr
shif:
mov edx,offset shift
mov byte ptr[sr],0
jmp pr
acc:mov edx,offset accp
mov byte ptr[sr],3
jmp pr
pr:
call WriteString
call WriteDec
call crlf
ret
iterParseTableEntry ENDP
;设置parseTable
setParseTable PROC
mov eax,0
mov ebx,0
mov sr,3        ;3代表结束
mov entry,0
call setEntry
mov eax,0
mov ebx,2
mov sr,0
mov entry,3
call setEntry
mov eax,0
mov ebx,3
mov sr,0
mov entry,7
call setEntry
mov eax,0
mov ebx,6
mov sr,0
mov entry,2
call setEntry
mov eax,0
mov ebx,7
mov sr,0
mov entry,1
call setEntry
mov eax,1
mov ebx,0
mov sr,3        ;3代表结束
mov entry,0
call setEntry
mov eax,1
mov ebx,2
mov sr,0
mov entry,3
call setEntry
mov eax,1
mov ebx,3
mov sr,0
mov entry,7
call setEntry
mov eax,1
mov ebx,6
mov sr,0
mov entry,2
call setEntry
mov eax,1
mov ebx,7
mov sr,0
mov entry,4
call setEntrymov eax,2
mov ebx,3
mov sr,0
mov entry,5
call setEntry
mov eax,3
mov ebx,3
mov sr,1
mov entry,2
call setEntry
mov eax,4
mov ebx,2
mov sr,1
mov entry,0
call setEntry
mov eax,4
mov ebx,3
mov sr,1
mov entry,0
call setEntry
mov eax,5
mov ebx,1
mov sr,0
mov entry,6
call setEntry
mov eax,6
mov ebx,0
mov sr,1        ;3代表结束
mov entry,1
call setEntry
mov eax,6
mov ebx,2
mov sr,1
mov entry,1
call setEntry
mov eax,6
mov ebx,3
mov sr,1
mov entry,1
call setEntry
mov eax,7
mov ebx,5
mov sr,0
mov entry,8
call setEntry
mov eax,8
mov ebx,4
mov sr,0
mov entry,9
call setEntry
mov eax,9
mov ebx,1
mov sr,0
mov entry,10
call setEntry
mov eax,10
mov ebx,0
mov sr,1
mov entry,3
call setEntry
mov eax,10
mov ebx,2
mov sr,1
mov entry,3
call setEntry
mov eax,10
mov ebx,3
mov sr,1
mov entry,3
call setEntry
ret
setParseTable ENDP
setEntry PROC
;设置ParseTable表项 eax:行,ebx:列 ecx:shift(0)或reduce(1), edx:shift值或reduce值 表项每个单元占4个字节 前两个表示是shift还是reduce 后两个表示对应值
mov si,32
mul si
push eax
mov eax,ebx
mov ebx,4
mul ebx
mov ebx,eax
pop eaxmov esi,offset parseTable
add eax,ebx
movzx edx,entry
mov cx,sr
mov word ptr[esi+eax],cx
mov word ptr[esi+eax+2],dx
ret
setEntry ENDP
;查看parseTable
iterSymbolTable PROC
mov esi,offset symbolTable
mov eax,0
movzx ecx,symbolTableCount
mov ebx,10
l1:
push eax
mul ebx
movzx eax,byte ptr[esi+eax+0]
call writeDec
call crlf
pop eax
inc eax
loop l1
ret
iterSymbolTable ENDP
;查看tempIDNameBuffer中存的id在表中有吗 有的话isNewId为1 否则为0
findIdInSymTab PROC
mov isNewId,0       ;默认没有
movzx ecx,symbolTableCount
mov eax,ecx
dec eax
mov esi,offset symbolTable
cmp ecx,0
je qu1
l1:
push eax
mov ebx,10
mul ebx
mov ebx,0
movzx ebx,byte ptr[esi+eax+0] ;id名字的位置
mov edx,0
l2:cmp [idNameBuffer+ebx+edx],0
je comLen
mov eax,0
mov al,[tempIDNameBuffer+edx]
cmp [idNameBuffer+ebx+edx],al
jne qu
inc edx
jmp l2
comlen:
cmp dl,tempIDNameBufferPointer
je equal
qu:
pop eax
dec eax
loop l1
retequal:
mov isNewId,1       ;
pop eax
mov idLoc,al
ret
qu1:retfindIdInSymTab ENDP
;如果是id  把id相关信息放表中
addSymbolTableEntry PROC
mov edx,offset tempIDNameBuffer
call WriteString
call crlfcall findIdInSymTab
cmp isNewId,0
je insert
mov al,isNewId
mov al,idloc
retinsert:
;向parseTable插入表项
mov esi,offset symbolTable
movzx eax,symbolTableCount
mov ebx,10
mul ebx
movzx ebx,IDNameBufferPointer
mov byte ptr[esi+eax+0],bl
mov byte ptr[esi+eax+1],0     ;初始位置 0
inc symbolTableCountmovzx eax,IDNameBufferPointer
;把ID名字从缓存区导出来
mov esi,offset IDNameBuffer
mov ebx,offset tempIDNameBuffer
movzx ecx,tempIDNameBufferPointer
add esi,eax
l1:
mov al,[ebx]
mov byte ptr[esi],al
inc esi
inc ebx
inc IDNameBufferPointer
loop l1
mov byte ptr[esi],0
inc IDNameBufferPointer
ret
addSymbolTableEntry ENDP;查看IDNameBuffer
lookIDNameBuffer PROC
mov esi,offset IDNameBuffer
movzx ecx,IDNameBufferPointer
mov ebx,0
l1:
movzx eax,byte ptr[esi+ebx]
call writeChar
inc ebx
loop l1
ret
lookIDNameBuffer ENDP
;解析Lex
LexAna PROC
mov tempIDNameBufferPointer,0
mov esi,offset sourceCode
lex:
cmp state,0
je state0
cmp state,1
je state1
cmp state,2
je state2
cmp state,3
je state3
cmp state,4
je state4
cmp state,5
je state5
cmp state,6
je state6
cmp state,7
je state7
cmp state,8
je state8
cmp state,9
je state9
cmp state,10
je state10
cmp state,11
je state11
state0:call readNextChar
mov ebx,sourceCodePointer
cmp eax,3bh     ;是分号吗
je state01
cmp eax,3dh     ;是=吗
je state011
cmp eax,69h     ;是i吗
je state02
cmp eax,0
je state08
cmp eax,30h     ;大于0?
jge isBlow9
jmp isid
isBlow9:
cmp eax,39h
jbe isNum
isid:
jmp state06     ;不是上面两个那就是 id了
isNum:
jmp state09     ;是数字    state01:mov state,1
jmp lex
state02:mov state,2
jmp lex
state06:mov state,6
jmp lex
state08:mov state,8
jmp lex
state09:mov state,9
jmp lex
state011:mov state,11
jmp lex
state1:mov state,0
mov token,1
retstate2:
call readNextCharcmp eax,6eh
je state23
jmp state26
state23:mov state,3
jmp lex
state26:mov state,6
jmp lexstate3:call readNextChar
cmp eax,74h
je state34
jmp state36
state34:mov state,4
jmp lex
state36:mov state,6
jmp lexstate4:call readNextChar
cmp eax,20h
je state45
jmp state46
state45:mov state,5
jmp lex
state46:mov state,6
jmp lexstate5:mov state,0
mov token,2
inc SourceCode
retstate6:call readNextChar
cmp eax,3bh
je state67      ;是分号吗
cmp eax,3dh
je state67      ;是等号吗
jmp lexstate67:
mov state,7
jmp lexstate7:dec sourceCodePointer
dec tempIDNameBufferPointer
movzx ebx,tempIDNameBufferPointer
mov [tempIDNameBuffer+ebx],0
mov state,0
mov token,3
retstate8:mov state,0
mov token,0
retstate9:call readNextChar
cmp eax,30h
jge isBlow
jmp qu
isBlow:
cmp eax,39h
jbe isN
jmp qustate910:
mov state,10
jmp lexstate10:dec sourceCodePointer
dec tempIDNameBufferPointer
movzx ebx,tempIDNameBufferPointer
mov [tempIDNameBuffer+ebx],0
mov state,0
mov token,4
retstate11:mov state,0
mov token,5
retisN:
jmp lexqu:
cmp eax,3bh
je state910     ;是分号吗 readNextChar:             ;读取下一个字节 放到eax中
mov ebx,sourceCodePointer
movzx eax,byte ptr[esi+ebx]
inc sourceCodePointer
call addIDBuffer
retaddIDBuffer:             ;把当前字节放到缓存中
movzx ebx,tempIDNameBufferPointer
mov [tempIDNameBuffer+ebx],al
inc tempIDNameBufferPointer
ret
LexAna ENDP
END main

自己做的的简单c语言编译器v1.1相关推荐

  1. c语言编译器下载 天天,简单C语言编译器(编译原理)

    简单C语言编译器(编译原理) (26页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 #include#include#include# ...

  2. 单片机c语言编译软件6,eUIDE下载-单片机c语言编译器 v1.07.32.23 官方版 - 安下载...

    eUIDE是一款专业的单片机c语言编译器,EM78系列集成开发环境是面向项目的ELAN EM78系列微控制器的开发工具,它包括UICE开发在线仿真器和eUIDE软件工具:eUIDE是基于PC端的UIC ...

  3. Tiny语言编译器简单介绍

    1.简单介绍:编译器是将一种语言翻译成还有一种语言的程序.编译器将源程序的代码作为输出,从而产生用目标语言编写的等价程序.比如源码为C/C++等高级语言,那么目标语言就是目标机器的机器代码.也就是能够 ...

  4. 用c语言做教学课程安排,C语言入门课程安排

    <C语言入门课程安排>由会员分享,可在线阅读,更多相关<C语言入门课程安排(5页珍藏版)>请在人人文库网上搜索. 1.C语言入门课程安排开班人数:2-5人年级:3年级以上第一课 ...

  5. 《C语言编程魔法书:基于C11标准》——1.3 主流C语言编译器介绍

    本节书摘来自华章计算机<C语言编程魔法书:基于C11标准>一书中的第1章,第1.3节,作者: 陈轶 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.3 主流 ...

  6. c语言编译前端,c语言编译器前端的设计与实现.doc

    c语言编译器前端的设计与实现 计 算 机 与 信 息 工 程 学 院 软硬件专业综合课程设计总结报告 题目: C语言编译器前端的设计与实现 姓 名: 学 号: 专 业: 计算机科学与技术 指导教师: ...

  7. Tiny C Compiler最小的C语言编译器

    TCC研究(1): Tiny C Compiler最小的C语言编译器,自己编译自己,tcccompiler 最近,在学习编译器技术, 研究了一下TCC, 记录一下. Tiny C Compiler(简 ...

  8. 编译原理大作业-PL0语言编译器

    编译原理大作业-PL0语言编译器 一.实验目的 二.源码说明 1.头文件pl0.h (1 词法分析主要数据结构(通过enum symbol类实现) 1.保留字(13+4个): 2.运算符及界符(16+ ...

  9. 手把手教你构建 C 语言编译器(8)- 表达式

    这是整个编译器的最后一部分,解析表达式.什么是表达式?表达式是将各种语言要素的一个组合,用来求值.例如:函数调用.变量赋值.运算符运算等等. 表达式的解析难点有二:一是运算符的优先级问题,二是如何将表 ...

最新文章

  1. Keil主题皮肤设置,自用推荐
  2. 从补码的来源剖析到为啥补码=原码按位取反+1
  3. 2019杭电多校第九场 Rikka with Cake (hdu6681)
  4. 算到怀疑人生!如何用并查集解决朋友圈个数问题?
  5. 小肽相关1~peptidomic discovery of short open reading frame–encoded peptides in human cells
  6. springboot 多环境配置文件
  7. 汽车电子ISO7637-2 5A/5B抛负载测试详解
  8. MFC ScreenToClient坐标转换错误
  9. 四两拨千斤——你不知道的VScode编码TypeScript的技巧
  10. 活动报名 | 保护儿童,保护未来!智源发布《面向儿童的人工智能北京共识》
  11. 八:微服务调用组件Dubbo
  12. IPv6地址自动配置
  13. lol服务器维护2021,lol维护公告最新时间2021.5.27 lol维护到几点
  14. 单片机中C语言延时函数
  15. 计算机专业论文 方向,计算机专业本科生方向论文题目 计算机专业本科生论文题目怎样取...
  16. Java:利用接口实现打印机案例(墨盒有彩色和黑白色,纸张有A4纸和B5纸)
  17. 求无向图最小环算法-floyd
  18. 详细介绍Android中Parcelable的原理和使用方法
  19. Flamingo插件_Contact Form 7表单数据存储插件
  20. idea点击接口的方法的跳到实现类的快捷键

热门文章

  1. C++ Primer Plus Chapter 4 --复合类型(笔记)
  2. DVWA指点迷津-CSP Bypass
  3. Leetcode 765 情侣牵手
  4. spring boot 集成socketIo 做消息推送
  5. mybatis-plus 存储布尔值true、false
  6. 【DockerCE】Docker-CE 24.0.1正式版发布
  7. 问下大家,chorme里用开发者工具看headers,点network标签然后刷新网页并没有headers选项,怎么破?...
  8. 大型三甲医院检验系统LIS源码 LIS系统源代码
  9. python 柱状图标出y值_Python——pyecharts数据可视化
  10. 第五人格服务器维修到几点,第五人格1月10日更新几点结束 第五人格1月10日更新维护公告...