- •Введение.
- •1 Задание на проектирование
- •2 Цели и требования
- •3 Внешний проект
- •3.1 Входные и выходные данные
- •3.2 Определение синтаксиса языка
- •3.3 Общая структура проекта
- •3.4 Структура выходного файла
- •3.5 Организация листинга
- •4 Проект архитектуры
- •4.1 Структуры данных
- •4.2 Алгоритмы основных функций
- •4.3 Схема вызовов процедур и функций
- •4.4 Организация процедуры компиляции
- •4.5 Спецификация основных процедур и функций
- •4.6 Обработка ошибок
- •5 Реализация
- •5.1 Тестирование
- •5.2 Документация для пользователя
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 невъебенных теста…