Смекни!
smekni.com

Разработка программы-компилятора (стр. 9 из 9)

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

if (Code_Tab [i]. Typ='T') and (Code_Tab [i]. Lex<>'end') and (Code_Tab [i]. Lex<>'begin') and (Code_Tab [i]. Lex<>'; ') then Err_Synt ('Лишняя лексема в программе: '+Code_Tab [i]. Lex, i);

end;

function TForm1. Lex_assign: boolean; // присваивание

begin

Lex_assign: =false;

if Code_Tab [i]. typ='I' then

begin

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

begin

i: =i+2;

if Lex_Exp=true then Lex_assign: =true else Memo2. Lines [1]: =Memo2. Lines [1] +' в операторе присваивания'

end else Err_Synt ('Ошибка в операторе присваивания', i)

end;

end;

function TForm1. Lex_Exp: boolean; // выражение

begin

Lex_Exp: =false;

if Lex_simple_Exp=true then

begin

if ( (Code_Tab [i]. Lex='=') or (Code_Tab [i]. Lex='>') or (Code_Tab [i]. Lex='<')

or (Code_Tab [i]. Lex='<>') or (Code_Tab [i]. Lex='<=') or (Code_Tab [i]. Lex='>=')) then

begin

i: =i+1;

if Lex_simple_Exp=true then

begin

Lex_Exp: =true;

Exit;

end;

end;

end else Exit;

Lex_Exp: =true; // если простое выражение без знака

end;

function TForm1. Lex_simple_Exp: boolean; // простое выражение

begin

Found: =false;

Lex_simple_Exp: =false;

if Lex_term=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_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; // терм

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; // множитель

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; // цикл

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; // тело цикла

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;

end.