Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
синтакс отчет1.doc
Скачиваний:
0
Добавлен:
22.11.2019
Размер:
207.87 Кб
Скачать

4.6 Обработка ошибок

Разработанный синтаксический анализатор обнаруживает следующие виды ошибок:

Ошибка

Причина

1

Error in program structure detected, may be an `;' expected

2

Unexpected end-of-file detected

Error detected during compilation... Stopped...

Error unexpected end-of-file at line

program name must be a word

Wrong type definition, may be expected `:'

Invalid identificator name

expected type declaration

Function must have some name

Here must be variable or const definition

`;' Expected

`:' Expected

Function type specific-word must be a WORD!

Unknown type definition

Begin expected

Syntax error: Dublicate identificator

unknow identificator

Boolean operation dont supported

5 Реализация

5.1 Тестирование

5.1.1 Внешние тесты

Входной файл на языке Паскаль test.pas:

program test;

var x:integer;

cy,h,c:integer;

function f(x:integer; var i,j:integer):integer;

var

d:integer;

begin

f:=x+i*j;

end;

var a:integer;

begin

cy:= 6;

c:= 9;

x:=c/cy + f(4,c ,cy);

end.

Выходной файл на языке Ассемблера test.asm:

; ---- primitive asm code generator (.pas to .asm)

;include procedure call and expression enterpriter

.386

.model flat, stdcall

option casemap :none

include masm32.inc

includelib lib1.lib

includelib masm32.lib

ExitProcess PROTO :DWORD

outdec PROTO :DWORD

__codeblock000 PROTO

__codeblock001 PROTO

.data

out_ db 200 dup (0)

real_ db 200 dup (0)

nl_ db 0Dh, 0Ah, 00h

nul_ db 30h, 00h

mm_ db '-', 00h

.code

outdec proc NUM:DWORD

pusha

push es

push ds

pop es

lea edi, out_

mov eax, NUM

cmp eax, 0

jl _otr

jne _ok

invoke StdOut, offset nul_

ret

_otr:

invoke StdOut, offset mm_

ret

_ok:

xor ebx, ebx

mov bl, 10

xor ecx, ecx

;===

cld

ll:

cmp eax, 0

jle ex

xor edx, edx

div ebx

xchg eax, edx

add al, 30h

stosb

mov al, 00h

stosb

xchg eax, edx

jmp ll

ex:

invoke StdOut, edi

sub edi, 2

cmp edi, offset out_

jge ex

;===

pop es

popa

ret

outdec endp

EntryPoint:

mov ebp, esp

sub esp, 20 ; vars to block 0

call __codeblock000

invoke ExitProcess,0

__codeblock000 proc

mov eax, 6

mov DWORD PTR [ebp-4], eax

mov eax, 9

mov DWORD PTR [ebp-12], eax

sub esp, 16 ; vars to block 1

mov eax, 4

push eax

mov eax, 12

push eax

mov eax, 4

push eax

call __codeblock001

add esp, 28

push eax

mov eax, DWORD PTR [ebp-4]

mov ebx, DWORD PTR [ebp-12]

xchg eax, ebx

xor edx, edx

idiv ebx

pop ebx

add eax, ebx

mov DWORD PTR [ebp-0], eax

ret

__codeblock000 endp

__codeblock001 proc

mov eax, DWORD PTR [ebp-0]

mov ebx, DWORD PTR [ebp-16]

xor edx, edx

imul ebx

add eax, DWORD PTR [ebp-16]

ret

__codeblock001 endp

END EntryPoint

Входной файл на языке Паскаль test1.pas

program test1;

var i,j:integer;

x:integer;

function sum(i,j:integer):integer;

var

s:integer;

begin

s:=i+j;

sum:=s;

end;

begin

x:=sum (5,6);

end.

Выходной файл на языке Ассемблера test1.asm

; ---- primitive asm code generator (.pas to .asm)

;include procedure call and expression enterpriter

.386

.model flat, stdcall

option casemap :none

include masm32.inc

includelib lib1.lib

includelib masm32.lib

ExitProcess PROTO :DWORD

outdec PROTO :DWORD

__codeblock000 PROTO

__codeblock001 PROTO

.data

out_ db 200 dup (0)

real_ db 200 dup (0)

nl_ db 0Dh, 0Ah, 00h

nul_ db 30h, 00h

mm_ db '-', 00h

.code

outdec proc NUM:DWORD

pusha

push es

push ds

pop es

lea edi, out_

mov eax, NUM

cmp eax, 0

jl _otr

jne _ok

invoke StdOut, offset nul_

ret

_otr:

invoke StdOut, offset mm_

ret

_ok:

xor ebx, ebx

mov bl, 10

xor ecx, ecx

;===

cld

ll:

cmp eax, 0

jle ex

xor edx, edx

div ebx

xchg eax, edx

add al, 30h

stosb

mov al, 00h

stosb

xchg eax, edx

jmp ll

ex:

invoke StdOut, edi

sub edi, 2

cmp edi, offset out_

jge ex

;===

pop es

popa

ret

outdec endp

EntryPoint:

mov ebp, esp

sub esp, 12 ; vars to block 0

call __codeblock000

invoke ExitProcess,0

__codeblock000 proc

sub esp, 12 ; vars to block 1

mov eax, 6

push eax

mov eax, 5

push eax

call __codeblock001

add esp, 20

mov DWORD PTR [ebp-8], eax

ret

__codeblock000 endp

__codeblock001 proc

mov eax, DWORD PTR [ebp-0]

add eax, DWORD PTR [ebp-16]

mov DWORD PTR [ebp-8], eax

mov eax, DWORD PTR [ebp-0]

ret

__codeblock001 endp

END EntryPoint

2 невъебенных теста…