Разработка программы-компилятора
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 Вызов и загрузка
Другие рефераты на тему «Программирование, компьютеры и кибернетика»:
- Использование современной компьютерной техники и программного обеспечения для решения прикладных задач в области геодезических измерений
- Настройка механизмов контроля и регистрации
- Математическое программирование
- Разработка прикладного программного обеспечения деятельности предприятия в системе клиент-сервер
- Анализ области определения функции
Поиск рефератов
Последние рефераты раздела
- Основные этапы объектно-ориентированного проектирования
- Основные структуры языка Java
- Основные принципы разработки графического пользовательского интерфейса
- Основы дискретной математики
- Программное обеспечение системы принятия решений адаптивного робота
- Программное обеспечение
- Проблемы сохранности информации в процессе предпринимательской деятельности