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

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

6,0]: =R;

StringGrid3. Cells [7,0]: =Путь; // определение заголовков

for k: =1 to NumTerm do // вывод таблицы терминальных символов

begin

StringGrid3. cells [0,k]: = Inttostr (Term_Tab [k]. nomer);

StringGrid3. cells [1,k]: = Term_Tab [k]. lex;

StringGrid3. cells [2,k]: = Inttostr (Term_Tab [k]. razd);

StringGrid3. cells [3,k]: = Inttostr (Term_Tab [k]. oper);

StringGrid3. cells [4,k]: = Inttostr (Term_Tab [k]. slug);

StringGrid3. cells [5,k]: = Inttostr (Term_Tab [k]. Left);

StringGrid3. cells [6,k]: = Inttostr (Term_Tab [k]. Right);

StringGrid3. cells [7,k]: = Term_Tab [k]. Way;

end;

AssignFile (F,Term. txt); // запись в файл таблицы терминальных символов

Rewrite (F);

for k: =1 to NumTerm do Writeln (F, StringGrid3. cells [0,k] + +StringGrid3. cells [1,k] + +StringGrid3. cells [2,k] + +StringGrid3. cells [3,k] + +StringGrid3. cells [4,k]);

CloseFile (F);

StringGrid4. Cells [0,0]: =№; StringGrid4. Cells [1,0]: =Тип; StringGrid4. Cells [2,0]: =№ в таблице; StringGrid4. Cells [3,0]: =Лексема; // определение заголовков

for k: =1 to NumLex do // вывод таблицы кодов лексем

begin

StringGrid4. cells [0,k]: = Inttostr (Code_Tab [k]. nomer);

StringGrid4. cells [1,k]: = Code_Tab [k]. typ;

StringGrid4. cells [2,k]: = Inttostr (Code_Tab [k]. num);

StringGrid4. cells [3,k]: = Code_Tab [k]. lex;

end;

AssignFile (F,Cod. txt); // запись в файл выходной таблицы

Rewrite (F);

for k: =1 to NumLex do Writeln (F, StringGrid4. cells [0,k] + +StringGrid4. cells [1,k] + +StringGrid4. cells [2,k] + +StringGrid4. cells [3,k]);

CloseFile (F);

end;

procedure TForm1. Err_Lex; // процедура вывода ошибки в лексеме

begin

Memo2. Lines. Add (В строке №+Inttostr (String_counter+1) + ошибочная лексема +Lexem);

NumErr: =NumErr+1;

NumLex: =NumLex+1;

Code_Tab [NumLex]. nomer: =NumLex;

Code_Tab [NumLex]. Lex: =Lexem;

Code_Tab [NumLex]. typ: =E;

Code_Tab [NumLex]. Num: =NumErr;

Exit;

end;

procedure TForm1. N6Click (Sender: TObject);

begin

Syntax;

end;

procedure TForm1. Syntax;

begin

i: =1; // инициализация

Error: =false;

Scobka: =false;

Memo2. Clear;

if (Lex_Progr=true) and (Error<>true) then Memo2. Lines [0]: =Ошибок нет else if Memo2. Lines [0] = then Memo2. Lines [0]: =Неизвестная ошибка

end;

function TForm1. Lex_Progr: boolean; // 1. программа

begin

Lex_Progr: =False;

if Code_Tab [i]. Lex=program then i: =i+1 else // конец блока для PROGRAM

begin

Err_Synt (Отсутствует служебное слово program, либо в нем ошибка , i);

Exit;

end;

if Lex_Prog_Name=false then Exit; // начало блока для имени программы

if Code_Tab [i]. Lex=; then i: =i+1 else // начало блока для точки с запятой

begin

Err_Synt (Отсутствует точка с запятой после имени программы, i-1);

Exit;

end;

if Code_Tab [i]. Lex=var then i: =i+1 else // начало блока для VAR

begin

Err_Synt (Отсутствует служебное слово var после заголовка программы, i);

Exit;

end;

if Lex_descr_list=false then Exit;

if Code_Tab [i]. Lex=begin then // начало блока для BEGIN

begin

i: =i+1;

if Code_Tab [i]. Lex=; then

begin

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

Exit;

end;

end else

begin

Err_Synt (Отсутствует служебное слово begin после описаний переменных, i);

Exit;

end;

if Lex_oper_list=false then Exit;

if Code_Tab [i]. Lex=end then i: =i+1 else // начало блока для END

begin

Err_Synt (Отсутствует служебное слово end в конце программы, i);

Exit;

end; // начало блока для точки

if Code_Tab [i]. Lex=. then Lex_Progr: =true else if Code_Tab [i]. Lex<> then Err_Synt (После служебного слова END вместо точки находится "+Code_Tab [i]. Lex+", i) else Err_Synt (Ожидается точка после служебного слова END в конце программы, i-1);

end;

procedure TForm1. Err_Synt (text: string; l: integer);

begin

if Error<>true then

begin

Memo1. Lines [Code_tab [l]. numstr-1]: =Memo1. Lines [Code_tab [l]. numstr-1] +!!! +Error!!! ;

Memo2. Lines [0]: =Memo2. Lines [0] +text;

end;

Error: =true;

Exit;

end;

function TForm1. Lex_Prog_Name: boolean; // имя программы

begin

Lex_Prog_Name: =False;

if (Code_Tab [i]. typ; ) then

begin

Err_Synt (Неправильное имя программы. Ошибочное выражение: "+Code_Tab [i]. Lex+", i);

Exit;

end;

if Code_Tab [i]. Lex=; then

begin

Err_Synt (Отсутствует имя программы после program, i);

Exit;

end;

Lex_Prog_Name: =true;

i: =i+1;

end;

function TForm1. Lex_Descr_List: boolean; // список описаний

begin

Lex_descr_list: =false;

Found: =false;

while Code_Tab [i]. typ=I do

begin

Found: =true;

if Lex_descr=false then Exit;

if Code_Tab [i]. Lex=; then i: =i+1 else

begin

Err_Synt (Отсутствует точка с запятой после описания переменных , i-1);

Exit;

end;

end;;

if Found=false then

begin

Err_Synt (Отсутствует идентификатор в описании , i);

Exit;

end;

Lex_descr_list: =true;

end;

function TForm1. Lex_descr: boolean; // описание

begin

Lex_descr: =false;

if Lex_name_list=true then

begin

if Code_Tab [i]. Lex=: then i: =i+1 else

begin

Err_Synt (Отсутствует двоеточие перед типом +Code_Tab [i]. Lex, i);

Exit;

end;

if Lex_type=true then Lex_descr: =true else Exit;

end else Exit;

end;

function TForm1. Lex_name_list: boolean; // список имен

begin

Lex_name_list: =false;

if Code_Tab [i]. typ=I then i: =i+1 else

begin

Err_Synt (Ожидается идентификатор , i);

Exit;

end;

while Code_Tab [i]. Lex=, do

begin

i: =i+1;

if Code_Tab [i]. Typ=I then i: =i+1 else

begin

Err_Synt (Ожидается идентификатор , i);

Exit;

end;

end;

Lex_name_list: =true;

end;

function TForm1. Lex_type: boolean; // тип

begin

Lex_type: =false;

if (Code_Tab [i]. Lex=integer) then

begin

Lex_type: =true;

i: =i+1

end else

begin

Err_Synt (Отсутствует тип: integer , i-1);

Exit;

end;

end;

function TForm1. Lex_oper_list: boolean; // список операторов

begin

Lex_oper_list: =false;

found: =false;

while Lex_oper=true do

begin

Found: =true;

if (Code_Tab [i]. Lex=; ) then i: =i+1 else // Если след. лексема после проверенного оператора ни "; ", ни END, а любая другая лексема.

if Code_Tab [i]. Lex<>end then

begin

Err_Synt (Ожидается точка с запятой после оператора (после лексемы +Code_Tab [i-1]. Lex+) , i-1);

Exit;

end;

end;

Lex_oper_list: =true;

if found=false then

begin

Err_Synt (Не найдены операторы между begin и end, i-1);

Lex_oper_list: =false;

end;

end;

function TForm1. Lex_oper: boolean;

begin

Lex_oper: =false;

if (Lex_assign) or (Lex_repeat_until) then Lex_oper: =true else

if (Code_Tab [i]. Lex=; ) and (Code_Tab [i-1]. Lex=; ) then Lex_oper: =true else // проверяется на пустой оператор, т.е. на &