Разработка программы-компилятора

i: =i+1;

if Lex_term=false then

begin

Found: =False;

Err_Synt ('Ожидается константа, идентификатор или выражение ', i-1);

Exit;

end;

end;

if (Code_Tab [i]. Lex=') ') and (Scobka=false) then Err_Synt ('Ожидается открывающаяся скобка в множителе', i)

end;

if Found=true then Lex_simple_Exp: =true;

end;

function TForm1. Lex_Term: boolean; // 13. терм

begin

Found: =false;

Lex_Term: =false;

if Lex_mnozh=true then

begin

Found: =true;

while ( (Code_Tab [i]. Lex='*') or (Code_Tab [i]. Lex='/')) and (Found=true) do

begin

i: =i+1;

if Lex_mnozh=false then Found: =False;

end;

end;

if Found=true then Lex_Term: =true;

end;

function TForm1. Lex_mnozh: boolean; // 14. множитель

begin

Lex_mnozh: =false;

if (Code_Tab [i]. typ='I') or (Code_Tab [i]. typ='C') then

begin

i: =i+1;

Lex_mnozh: =true;

Exit;

end else

begin

if Code_Tab [i]. Lex=' (' then

begin

Scobka: =true;

i: =i+1;

if Lex_simple_Exp=true then

begin

if Code_Tab [i]. Lex=') ' then

begin

i: =i+1;

Lex_mnozh: =true;

end else

begin

Err_Synt ('Ожидается закрывающая скобка в множителе ', i);

Exit;

end;

end;

end else Err_Synt ('Ожидается константа, идентификатор или выражение ', i);

end;

end;

function TForm1. Lex_repeat_until: boolean; // 18. цикл

begin

Lex_repeat_until: =false;

if Code_Tab [i]. Lex='repeat' then

begin

i: =i+1;

if Lex_body=true then begin i: =i+1;

if Code_Tab [i]. Lex='until' then begin i: =i+1;

if Lex_Exp=true then Lex_repeat_until: =true

else Err_Synt ('Ожидается выражение после служебного слова until', i); end

else Err_Synt ('Ожидается служебное слово until', i);

end;

end;

end;

function TForm1. Lex_body: boolean; // 20. тело цикла

begin

Lex_body: =false;

if Lex_oper=true then

begin

Lex_body: =true;

Exit;

end else

if Code_Tab [i]. Lex='begin' then

begin

i: =i+1;

if Code_Tab [i]. Lex='; ' then

begin

Err_Synt ('После begin недопустим символ "; "', i);

Exit;

end;

if Lex_oper_list=true then

begin

if (Code_Tab [i]. Lex='end') and (Code_Tab [i+1]. Lex<>'; ') then

begin

Lex_body: =true;

i: =i+1;

end else Err_Synt ('Ожидается служебное слово end после блока операторов', i-1)

end;

end;

end;

3.5 Результаты тестирования синтаксического анализатора

Тестирование выполнялось на результатах работы лексического анализатора, который работает безошибочно и был протестирован ранее.

Ошибка

Текст программы

Сообщения от анализатора

В объявлении имени программы

prom var15;

. .

program var15.

Отсутствует служебное слово program или в нём ошибка  

В описании

program var15;

n: integer;

. .

program var15;

var,: integer;

. .

program var15;

var n: integer

. .

var n integer

. .

var n:;

Отсутствует служебное слово var после заголовка программы

Отсутствует идентификатор в описании

Отсутствует точка с запятой после описания переменных

Отсутствует двоеточие перед типом integer

Отсутствует тип: integer

В begin. end

. .

begin;

. .

var n: integer;

n: =$+00;

. .

until n<$-0A;

После begin недопустим символ точка с запятой

Отсутствует служебное слово begin после описания переменных

Отсутствует служебное слово end в конце программы

В имени программы

.

program $+00;.

Неправильное имя программы. Ошибочное выражение: "$+00"

В операторе присваивания

.

n: $+00;

Ошибка в операторе присваивания

В выражении

.

n: =- (-XII); .

Ожидается константа, идентификатор или выражение

В цикле

.

repeat

n: =n- (-XII);

n<$-0A;.

Ожидается служебное слово until

В теле программы

.

n: =$+00.

Ожидается точка с запятой после оператора (после лексемы $+00)

4. Реализация двухфазного компилятора

Главные процедуры лексического и синтаксического анализатора - это, соответственно, процедуры N5. Click и N6. Click главной формы программы. Из них вызываются остальные подпрограммы

Текст исходная программа выводится в окне в верхнем левом углу формы. Если лексический анализ текста (процедура N5. Click) выявил ошибку, то она выводится в окне сообщёний об ошибках и анализ прекращается.

Лексический анализатор выводит на форму таблицы констант, идентификаторов, терминальных символов и кодов лексем в областях вывода StringGrid1, StringGrid2, StringGrid3 и StringGrid4.

После синтаксического анализа переданной таблицы кодов лексем в окне сообщений об ошибках синтаксического анализатора содержатся сообщения от распознающих процедур разного уровня, затронутых обнаруженной ошибкой (см п.3.5)

Ошибок при двухфазном анализе не выявлено, если область вывода лексических ошибок пуста, а для синтаксических - содержит текст "Ошибок нет".

Внешний вид окна программы представлен на рис.7.

4.1 Результаты тестирования двухфазного компилятора

полностью совпадают с результатами тестирования лексического и синтаксического анализатора по отдельности, проведённых последовательно.

рис.7. Внешний вид окна программы

5. Описание программы

5.1 Общие сведения и функциональное назначение

Данная программа предназначена для лексического и синтаксического анализа небольших (<1 МБ) текстов программ на заданном диалекте подмножества языка Pascal.

Программа написана на языке Delphi в среде разработки Delphi 7.

Программа предназначена для выявления наличия лексических и синтаксических ошибок во входном тексте программы.

5.2 Вызов и загрузка

Страница:  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15 


Другие рефераты на тему «Программирование, компьютеры и кибернетика»:

Поиск рефератов

Последние рефераты раздела

Copyright © 2010-2024 - www.refsru.com - рефераты, курсовые и дипломные работы