Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
58
Добавлен:
10.05.2014
Размер:
22.85 Кб
Скачать
{$R+}
program zolotukhin_bdz_64dec_40h;
const
max_level=20;
type
type_str255 = string[255];
type_filename = string[12];
type_operatorname = string[9];
type_tabs = record
child:boolean;
topmost:boolean;
level,next_level:byte;
spaces:array[0..max_level] of byte;
collapseto:array[0..max_level] of byte;
collapse:array[0..max_level] of boolean;
end;
type_operatorlist = array[1..14] of type_operatorname;
type_operatortypelist = array[1..14] of byte;
const
operator_letters='qwertyuiopasdfghjklzxcvbnm_1234567890';
lowercase='qwertyuiopasdfghjklzxcvbnm';
uppercase='QWERTYUIOPASDFGHJKLZXCVBNM';
operators:type_operatorlist=('var','type','const','procedure','function',
'else','then','do','repeat','record','case','end','until','begin');
operators_types:type_operatortypelist=(1,1,1,0,0,2,2,2,2,2,2,3,3,4);
procedure get_filenames(var name_in,name_out:type_filename);
begin
write('‚ўҐ¤ЁвҐ Ё¬п д ©«  б Їа®Ја ¬¬®©: ');
readln(name_in);
write('‚ўҐ¤ЁвҐ Ё¬п д ©«  ¤«п Є®¬¬Ґ­в аЁҐў: ');
readln(name_out);
end;
procedure open_files(var file_in,file_out:text;name_in,name_out:type_filename;var result:boolean);
begin
if (name_in<>'') and (name_out<>'') then{Ґб«Ё Ґбвм Ё¬Ґ­  д ©«®ў}
begin
assign(file_in,name_in);{®вЄалў Ґ¬ Ёе}
{$I-}
reset(file_in);
{$I+}
result:=IOResult=0;{Їа®ўҐа塞 ­  бгйҐбвў®ў ­ЁҐ ўе®¤­®© д ©«}
assign(file_out,name_out);
rewrite(file_out);
end
else{Ё­ зҐ}
result:=false;{®иЁЎЄ }
end;
procedure close_files(var file_in,file_out:text);
begin
close(file_in);
close(file_out);
end;
function string_tolower(s:type_str255):type_str255;
var
i:byte;
pos_symbol:byte;
begin
for i:=1 to length(s) do{¤«п Є ¦¤®Ј® бЁ¬ў®«  бва®ЄЁ}
begin
pos_symbol:=pos(copy(s,i,1),uppercase);
if pos_symbol<>0 then{Ґб«Ё нв® ЎгЄў , в®}
begin
delete(s,i,1);{г¤ «Ґ­ЁҐ нв®Ј® бЁ¬ў®« }
insert(copy(lowercase,pos_symbol,1),s,i);{ўбв ўЄ  ­  ¬Ґбв® бЁ¬ў®«  ҐЈ® 㬥­м襭­л© ў аЁ ­в}
end;
end;
string_tolower:=s;
end;
function trim(var str:type_str255):byte;
var
start_count:byte;
begin
start_count:=0;
while pos(' ',str)=1 do{г¤ «Ґ­ЁҐ Їа®ЎҐ«®ў б ­ з « }
begin
delete(str,1,1);
start_count:=start_count+1;
end;
while copy(str,length(str),1) = ' ' do{г¤ «Ґ­ЁҐ Їа®ЎҐ«®ў б Є®­ж }
delete(str,length(str),1);
trim:=start_count;
end;
procedure delete_all_spaces(var str:type_str255);
begin
while pos(' ',str)<>0 do
delete(str,pos(' ',str),1);
end;
function pos_from(str_find:type_operatorname;str:type_str255;start:byte):byte;
begin
delete(str,1,start-1+length(str_find));{г¤ «Ґ­ЁҐ ўбҐе бЁ¬ў®«®ў ¤® бв ав®ў®© Ї®§ЁжЁЁ}
if pos(str_find,str)<>0 then{Ґб«Ё бЁ¬ў®« Ґбвм}
pos_from:=pos(str_find,str)+start-1+length(str_find){Є Ї®§ЁжЁЁ бЁ¬ў®«  ЇаЁЎ ў«пҐвбп Є®«-ў® г¤ «к­­ле бЁ¬ў®«®ў}
else{Ё­ зҐ}
pos_from:=0;{Ї®§ЁжЁп а ў­  0}
end;
function delete_range(str_current:type_str255;opening,closing:type_operatorname):type_str255;
var
delete_count:byte;
begin
while (pos(opening,str_current)<>0) and (pos(closing,str_current)<>0) do{Ї®Є  Ґбвм ®вЄалў ойЁ©бп Ё § Єалў ойЁ©бп бЁ¬ў®«л}
begin
if pos_from(closing,str_current,pos(opening,str_current))>pos(opening,str_current) then{Ґб«Ё бЁ¬ў®«л Ї® Ї®ап¤Єг}
begin
delete_count:=pos_from(closing,str_current,pos(opening,str_current))-pos(opening,str_current)+length(closing);
delete(str_current,pos(opening,str_current),delete_count);{г¤ «Ґ­ЁҐ ⥪бв  ¬Ґ¦¤г ®вЄалў ойЁ¬бп Ё § Єалў ойЁ¬бп бЁ¬ў®« ¬Ё}
end;
end;
delete_range:=str_current;
end;
function operator_pos(str_search,str:type_str255):byte;
var
position:byte;
found_match:boolean;
end_of_string,start_of_string,blank_at_start,blank_at_end:boolean;
deleted_symbols:byte;
begin
found_match:=false;
position:=0;
deleted_symbols:=0;
while (pos(str_search,str)<>0) and not found_match do{¤® вҐе Ї®а, Ї®Є  ®ЇҐа в®а ў бва®ЄҐ Ґбвм Ё нв® ­Ґ Ї®¦вўҐа¦¤Ґ­®}
begin
start_of_string:=pos(str_search,str)=1;
blank_at_start:=pos(copy(str,pos(str_search,str)-1,1),operator_letters)=0;
end_of_string:=(pos(str_search,str)+length(str_search))=(length(str)+1);
blank_at_end:=pos(copy(str,pos(str_search,str)+length(str_search),1),operator_letters)=0;
found_match:=(blank_at_start or start_of_string) and (blank_at_end or end_of_string);
if found_match then{Ґб«Ё ®ЇҐа в®а ®Єа㦥­ в®«мЄ® Їа®ЎҐ« ¬Ё Ё«Ё ¤агЈЁ¬Ё ­ҐЎгЄў ¬Ё, в®}
position:=pos(str_search,str)+deleted_symbols;{§ ЇЁблў Ґ¬ ҐЈ® Ї®§ЁжЁо}
deleted_symbols:=deleted_symbols+length(str_search);{§ ЇЁблў Ґ¬ ᬥ饭ЁҐ}
delete(str,pos(str_search,str),length(str_search));{г¤ «пҐ¬ ®ЇҐа в®а }
end;
operator_pos:=position;
end;
function delete_multirange(str:type_str255;opening,closing:type_operatorname;var opened:boolean):type_str255;
begin
str:=delete_range(str,opening,closing);{г¤ «Ґ­ЁҐ ўбҐЈ® § Єалв®Ј® Ё§ бва®ЄЁ}
if opened and (pos(closing,str)=0) then{Ґб«Ё ўбҐ § Є®¬¬Ґ­вЁа®ў ­® ¤® нв®Ј®, в®}
str:='';{г¤ «пҐ¬ бва®Єг}
if opened and (pos(closing,str)<>0) then{Ґб«Ё ¤Ё Ї §®­ ®вЄалв Ё Ґбвм § Єалў ой пбп бЄ®ЎЄ , в®}
begin
opened:=false;{§ Єалў Ґ¬ ¤Ё Ї §®­}
delete(str,1,pos(closing,str)-1+length(closing));{г¤ «Ґ­ЁҐ ⥪бв  ¤® § Єалў о饩бп бЄ®ЎЄЁ}
end;
if not opened and (pos(opening,str)<>0) then{Ґб«Ё ¤Ё Ї §®­ ­Ґ ®вЄалв Ё Ґбвм ®вЄалў ой пбп бЄ®ЎЄ }
begin
opened:=true;{®вЄалў Ґ¬ ¤Ё Ї §®­}
delete(str,pos(opening,str),length(str)-pos(opening,str)+1);{г¤ «Ґ­ЁҐ ⥪бв  Ї®б«Ґ ®вЄа. бЄ®ЎЄЁ}
end;
delete_multirange:=str;
end;
procedure delete_bracket_set(var str:type_str255);
var
last_pos:byte;
begin
last_pos:=0;
while (pos_from('(',str,last_pos)<>0) and (pos_from('(',str,last_pos)<pos(')',str)) do{Ї®Є  Є Ў«Ё¦Ґ (, 祬 )}
last_pos:=pos_from('(',str,last_pos);{§ ЇЁблў Ґ¬ Ї®§ЁжЁо (}
if last_pos<>0 then{Ґб«Ё Ґбвм Є®­бвагЄжЁЁ ўЁ¤  ()}
delete(str,last_pos,pos(')',str)-last_pos+1);{г¤ «пҐ¬ ўбҐ ¬Ґ¦¤г Ї®б«Ґ¤­Ґ© ( Ё Ў«Ё§¦ ©иҐ©)}
end;
function delete_brackets(str:type_str255):type_str255;
begin
while (pos('(',str)<>0) and (pos_from(')',str,pos('(',str))>pos('(',str)) do{Ї®Є  §  ®вЄа. бЄ®ЎЄ®© б«Ґ¤гҐв § Єа}
delete_bracket_set(str);{г¤ «Ёвм ­ Ў®а бЄ®Ў®Є}
if pos(')',str)<>0 then{г¤ «пҐ¬ ЇҐаҐ­ҐбҐ­­лҐ бЄ®ЎЄЁ )}
delete(str,1,pos(')',str));
if pos('(',str)<>0 then{г¤ «пҐ¬ ЇҐаҐ­ҐбҐ­­лҐ бЄ®ЎЄЁ (}
delete(str,pos('(',str),length(str)-pos('(',str)+1);
delete_brackets:=str;
end;
procedure save_error(str:type_str255;line:integer;var no_errors:boolean;var file_out:text);
begin
writeln(file_out,'‘ва®Є  ',line,': ',str,'!');
no_errors:=false;
end;
function delete_strings(str:type_str255):type_str255;
begin
while pos(#39+#39+#39,str)<>0 do{Ї®Є  Ґбвм '''}
delete(str,pos(#39+#39+#39,str),3);{г¤ «пҐ¬ '''}
while (pos(#39,str)>0) and (pos_from(#39,str,pos(#39,str))>pos(#39,str)) do{Ї®Є  ' Ё¤св §  '}
delete(str,pos(#39,str),pos_from(#39,str,pos(#39,str))-pos(#39,str)+1);{г¤ «пҐ¬ ®в ' ¤® '}
while pos(#39,str)<>0 do{Ї®Є  Ґбвм '}
delete(str,pos(#39,str),1);{г¤ «пҐ¬ '}
delete_strings:=str;
end;
procedure clean_string(var str:type_str255;var comment_rem,comment_algorythm:boolean;var empty:boolean;var spaces:byte);
begin
str:=string_tolower(str);{ЇаҐўа йҐ­ЁҐ Ў®«миЁе ЎгЄў ў ¬ «Ґ­мЄЁҐ}
str:=delete_strings(str);{г¤ «Ґ­ЁҐ бва®Є}
if not comment_rem then{®Ўа Ў®вЄ  Є®¬¬Ґ­в аЁҐў}
str:=delete_multirange(str,'{','}',comment_algorythm);
if not comment_algorythm then{®Ўа Ў®вЄ  § Є®¬¬Ґ­вЁа®ў ­­ле Є®­бвагЄжЁ©}
str:=delete_multirange(str,'(*','*)',comment_rem);
spaces:=trim(str);{г¤ «Ґ­ЁҐ Їа®ЎҐ«®ў}
empty:=str='';{Їа®ўҐаЄ  ­  в®, Їгбв п «Ё бва®Є }
end;
procedure process_operator(var str_current:type_str255;op_type:byte;operator:type_operatorname;var operators_count:byte);
begin
while operator_pos(operator,str_current)<>0 do{Ґб«Ё ўбваҐз Ґвбп Ё§ўҐбв­л© ®ЇҐа в®а}
begin
operators_count:=operators_count+1;{бзЁв Ґ¬ ҐЈ®}
delete(str_current,operator_pos(operator,str_current),length(operator));{г¤ «пҐ¬ ҐЈ®}
if((op_type=0) or (op_type=3)) and (pos(';',str_current)<>0) then{Ґб«Ё ®ЇҐа в®аг Ї®«®¦Ґ­  ; Ё ®­  Ґбвм}
delete(str_current,pos(';',str_current),1);{г¤ «пҐ¬ ᮮ⢥вбвўгойЁ© Ґ¬г ;}
end;
end;
procedure check_operators_count(str_current:type_str255;var operators_count,previous_operators_count:byte;line:integer;
var no_errors:boolean;var file_out:text);
var
i:byte;
operators_count_str:string[3];
begin
str_current:=delete_brackets(str_current);{г¤ «Ґ­ЁҐ бЄ®Ў®Є}
previous_operators_count:=operators_count;
operators_count:=0;
for i:=1 to 14 do{®Ўа Ў®вЄ  ®ЇҐа в®а®ў Ё§ в Ў«Ёжл ў ¤ ­­®© бва®ЄҐ}
process_operator(str_current,operators_types[i],operators[i],operators_count);
while pos(';',str_current)<>0 do{¤«п Є ¦¤®Ј® бЁ¬ў®«  ;}
begin
operators_count:=operators_count+1;{бзЁв Ґ¬}
delete(str_current,pos(';',str_current),1);{г¤ «пҐ¬ ҐЈ®}
end;
if operators_count>1 then {Ґб«Ё Ў®«миҐ 1 ®ЇҐа в®а }
begin
str(operators_count,operators_count_str);{ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ}
save_error(operators_count_str+' ®ЇҐа в®а (®ў) ­  бва®зЄҐ',line,no_errors,file_out);
end;
end;
procedure process_operator_tab(operator_type:byte;var tabs_data:type_tabs;level_up:boolean;var previous_level:byte);
begin
case operator_type of{ᬮваЁ¬ ҐЈ® вЁЇ}
1:begin{гбв ­®ўЄ  1-Ј® га®ў­п ¤«п var,const, type Ё ’Џ}
(*if not tabs_data.topmost then(*§ Є®¬¬Ґ­вЁа®ў вм нвг бва®зЄг ¤«п ¤агЈ®Ј® ०Ё¬ *)
(*begin*)
previous_level:=0;
tabs_data.spaces[0]:=0;(*§ Є®¬¬Ґ­вЁа®ў вм нвг бва®зЄг ¤«п ¤агЈ®Ј® ०Ё¬ *)
(*end;*)
tabs_data.spaces[1]:=0;
tabs_data.next_level:=2;
tabs_data.level:=1;
tabs_data.topmost:=true;
tabs_data.collapse[2]:=false;
tabs_data.collapse[1]:=true;
tabs_data.collapseto[2]:=1;
end;
0:begin{гбв ­®ўЄ  ­г«Ґў®Ј® га®ў­п ¤«п Їа®жҐ¤га/дг­ЄжЁ©}
tabs_data.next_level:=1;
tabs_data.level:=0;
tabs_data.child:=true;
tabs_data.collapse[1]:=true;
tabs_data.collapseto[1]:=0;
end;
2:begin{Ї®ўл襭ЁҐ га®ў­п ў«®¦Ґ­­®бвЁ ¤«п жЁЄ«®ў, ўҐвў«Ґ­Ё© Ё Їа®з}
tabs_data.next_level:=tabs_data.next_level+1;
if not tabs_data.collapse[tabs_data.level] then
tabs_data.collapseto[tabs_data.next_level]:=tabs_data.level
else
tabs_data.collapseto[tabs_data.next_level]:=tabs_data.collapseto[tabs_data.level];
tabs_data.spaces[tabs_data.next_level]:=0;
tabs_data.collapse[tabs_data.next_level]:=level_up;{Ґб«Ё ­Ґ record,repeat,case, ®ЇҐа в®а бў®а зЁў Ґвбп}
end;
3:begin{Ї®­Ё¦Ґ­ЁҐ га®ў­п ў«®¦Ґ­­®бвЁ (end,until)}
tabs_data.spaces[tabs_data.level]:=0;
tabs_data.level:=tabs_data.collapseto[tabs_data.level];
tabs_data.next_level:=tabs_data.level;
if tabs_data.collapse[tabs_data.level] then
tabs_data.next_level:=tabs_data.collapseto[tabs_data.level];
end;
4:begin{begin ­ е®¤Ёвбп ­  ®¤­®¬ га®ў­Ґ б ҐЈ® ®ЇҐа в®а®¬}
if tabs_data.topmost then
begin
previous_level:=0;(*а бЄ®¬¬Ґ­вЁа®ў вм §вг бва®зЄг ¤«п ¤агЈ®Ј® ०Ё¬  а Ў®вл*)
tabs_data.next_level:=2;
tabs_data.level:=1;
tabs_data.topmost:=false;
tabs_data.collapse[1]:=true;
tabs_data.collapseto[1]:=0;
(*tabs_data.spaces[2]:=0;(*а бЄ®¬¬Ґ­вЁа®ў вм §вг бва®зЄг ¤«п ¤агЈ®Ј® ०Ё¬  а Ў®вл*)
end
else
tabs_data.next_level:=tabs_data.next_level+1;
tabs_data.collapse[tabs_data.next_level]:=false;
tabs_data.collapseto[tabs_data.next_level]:=tabs_data.level;
end;
end;
end;
procedure check_tabs(str_curr:type_str255;spaces:byte;operators_count,previous_operators_count:byte;line:integer;
var tabs_data:type_tabs;var no_errors:boolean;var file_out:text);
var
level_up:boolean;
i:integer;
incorrect:boolean;
previous_level:byte;
begin
str_curr:=delete_brackets(str_curr);{г¤ «Ґ­ЁҐ бЄ®Ў®Є}
previous_level:=tabs_data.level;
tabs_data.level:=tabs_data.next_level;
incorrect:=false;

if (previous_operators_count=0) and ((operator_pos('end',str_curr)<>0) or (operator_pos('else',str_curr)<>0))
and tabs_data.collapse[tabs_data.level] then
begin{®Ўа Ў®вЄ  Ґб«Ё ­Ґв ; ЇҐаҐ¤ end Ё«Ё else}
tabs_data.level:=tabs_data.collapseto[tabs_data.level];
tabs_data.next_level:=tabs_data.level;
end;
for i:=1 to 14 do{Їа®ўҐаЄ  Є ¦¤®Ј® ®ЇҐа в®а  Ё§ бЇЁбЄ }
begin
if operator_pos(operators[i],str_curr)<>0 then{Ґб«Ё ®ЇҐа в®а ­ ©¤Ґ­ ў бва®ЄҐ}
begin
level_up:=(operator_pos('record',str_curr)=0)and(operator_pos('case',str_curr)=0)
and (operator_pos('repeat',str_curr)=0);
process_operator_tab(operators_types[i],tabs_data,level_up,previous_level);{®Ўа Ў вў Ґ¬ ҐЈ®}
end;
end;

if operator_pos('record',str_curr)<>0 then{end record'  ¤®«¦Ґ­ Ўлвм Ї®¤ ­Ё¬}
begin
spaces:=spaces+operator_pos('record',str_curr)-1;
tabs_data.level:=tabs_data.level+1;
tabs_data.collapse[tabs_data.level]:=true;
tabs_data.collapseto[tabs_data.level]:=tabs_data.level-1;
tabs_data.next_level:=tabs_data.next_level+1;
tabs_data.collapse[tabs_data.next_level]:=false;
tabs_data.collapseto[tabs_data.next_level]:=tabs_data.level;
end;

if (tabs_data.level<>0) and not ((tabs_data.level=previous_level) and
(previous_operators_count=0)) then{Ґб«Ё ®ЇҐа в®а ­Ґ 0Ј® га®ў­п}
begin
if (tabs_data.level>previous_level) or (tabs_data.spaces[tabs_data.level]=0)
or (tabs_data.spaces[tabs_data.level]=0) then{Ґб«Ё га®ўҐ­м 㢥«ЁзЁ«бп}
begin
if ((spaces>=tabs_data.spaces[tabs_data.collapseto[tabs_data.level]]) and (operator_pos('begin',str_curr)<>0))
or (spaces>tabs_data.spaces[tabs_data.collapseto[tabs_data.level]]) then
tabs_data.spaces[tabs_data.level]:=spaces{㢥«ЁзЁў Ґ¬ Їа®ЎҐ«л}
end;
incorrect:=spaces<>tabs_data.spaces[tabs_data.level];{®иЁЎЄ , Ґб«Ё Їа®ЎҐ«®ў ­Ґ ­г¦­®Ґ Є®«ЁзҐбвў®}
if (spaces=0) and (tabs_data.level>1) then{®иЁЎЄ , Ґб«Ё Їа®ЎҐ«®ў ­Ґв ў®®ЎйҐ}
incorrect:=true;
end;

if incorrect then{ўлў®¤ ®иЁЎЄЁ}
save_error('­Ґ б®Ў«о¤Ґ­л ®вбвгЇл',line,no_errors,file_out);

if (tabs_data.next_level=tabs_data.level) and tabs_data.collapse[tabs_data.level] and
(operator_pos('begin',str_curr)=0) then{ ўв®§ ЄалвЁҐ ®ЇҐа в®а®ў ЎҐ§ begin-end}
begin
tabs_data.next_level:=tabs_data.collapseto[tabs_data.level];
tabs_data.spaces[tabs_data.level]:=0;
end;
end;
procedure check_arrays(str:type_str255;line:integer;var no_errors:boolean;var file_out:text);
begin
if (pos('[',str)<>0) and (pos('[',str)<pos(']',str)) then{Ґб«Ё Ґбвм [ Ё ]}
begin
delete_all_spaces(str);{г¤ «пҐ¬ Їа®ЎҐ«л}
if operator_pos('array',str)+length('array')=pos('[',str) then{Ґб«Ё §  б«®ў®¬ array Ё¤Ґв [}
begin
str:=copy(str,pos('[',str)+1,pos(']',str)-pos('[',str)-1);{Є®ЇЁа㥬 ўбҐ, зв® ¬Ґ¦¤г []}
str:=delete_brackets(str);{г¤ «пҐ¬ бЄ®ЎЄЁ}
if pos(',',str)<>0 then{Ґб«Ё Ґбвм § Їпв п}
save_error('¬ ббЁўл ­Ґ«м§п ¤ҐЄ« аЁа®ў вм ў ўЁ¤Ґ [m,n]',line,no_errors,file_out);{ўлў®¤Ё¬ ᮡ饭ЁҐ}
end;
end;
end;
procedure check_begin_end(str:type_str255;tabs_data:type_tabs;var be_level:byte;var be_line,previous_line:integer;line:integer;
var no_errors:boolean;var file_out:text);
begin
if be_level>0 then{Ґб«Ё Ўл« ®ЇҐа в®а ЎҐ§ begin-end}
begin
if (tabs_data.level>be_level) and tabs_data.collapse[tabs_data.level] then{Ґб«Ё ᥩз б  ўв®§ Єалў ойЁ©бп ®ЇҐа в®а}
begin
save_error('ў® ў«®¦Ґ­­ле Є®­бвагЄжЁпе ­Ґв begin-end',be_line,no_errors,file_out);{ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ ®Ў ®иЁЎЄҐ}
be_level:=0;{§ Ўлў Ґ¬}
end;
if be_level<=tabs_data.level then{Ґб«Ё га®ўҐ­м 㬥­миЁ«бп}
be_level:=0;{§ Ўлў Ґ¬}
end;

if tabs_data.collapse[tabs_data.level] and (tabs_data.level>1) then{Ґб«Ё ­Ґв begin-end}
begin
be_level:=tabs_data.level;{§ Ї®¬Ё­ Ґ¬}
be_line:=previous_line;
end;
previous_line:=line;{§ ЇЁблў Ґ¬ ЇаҐ¤л¤гйго бва®зЄг}
end;
procedure check_cycles(str:type_str255;var cycle_level:byte;level:byte;line:integer;var no_errors:boolean;var file_out:text);
begin
if (cycle_level=level) and (operator_pos('begin',str)=0) then{Ґб«Ё га®ўҐ­м жЁЄ«  а ўҐ­ ⥪г饬г га®ў­о}
cycle_level:=0;{§ Єалў Ґ¬ жЁЄ«}

if (operator_pos('do',str)<>0) or (operator_pos('repeat',str)<>0) then{Ґб«Ё ў бва®ЄҐ ўбваҐз Ґвбп Є«. б«®ў® жЁЄ« }
begin
if cycle_level<>0 then{Ґб«Ё ў­гваЁ жЁЄ« }
save_error('­Ґ«м§п ЁбЇ®«м§®ў вм ў«®¦Ґ­­лҐ жЁЄ«л',line,no_errors,file_out){ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ}
else{Ё­ зҐ}
cycle_level:=level;{§ ЇЁблў Ґ¬ га®ўҐ­м жЁЄ« }
end;
end;
function get_variable(str:type_str255):type_str255;
begin
str:=copy(str,1,pos(':=',str)-1);{б®е࠭塞 ўбҐ ¤® :=}
while pos(' ',str)<>0 do{Ї®Є  Ґбвм Їа®ЎҐ«л}
delete(str,1,pos(' ',str));{г¤ «пҐ¬ ўбҐ, зв® ЇҐаҐ¤ ­Ё¬Ё}
get_variable:=str;
end;
procedure check_cycle_var(str:type_str255;cycle_level:integer;var cycle_variable:type_str255;line:integer;
var no_errors:boolean;var file_out:text);
begin
if cycle_level<>0 then{Ґб«Ё ў­гваЁ жЁЄ« }
begin
if cycle_variable='' then{Ґб«Ё ­ҐЁ§ўҐбв­® Ё¬п ЇҐаҐ¬Ґ­­®©}
begin
if operator_pos('for',str)<>0 then{Ґб«Ё жЁЄ« for}
cycle_variable:=get_variable(str);{§ ЇЁблў Ґ¬ Ё¬п ЇҐаҐ¬Ґ­­®©}
end
else{Ё­ зҐ}
begin
if pos(cycle_variable+':=',str) <> 0 then{Ґб«Ё ЇҐаҐ¬Ґ­­®© ЇаЁбў Ёў Ґвбп §­ зҐ­ЁҐ}
save_error('­Ґ«м§п ¬Ґ­пвм ЇҐаҐ¬Ґ­­го жЁЄ« ',line,no_errors,file_out);{ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ}
end;
end
else{Ё­ зҐ}
cycle_variable:='';{ЇҐаҐ¬Ґ­­ п а ў­  ''}
end;
procedure check_global_variables(str:type_str255;child:boolean;var var_pos:integer;line:integer;var no_errors:boolean;
var file_out:text);
var
procedure_or_function:boolean;
begin
str:=delete_brackets(str);
if not child and (operator_pos('var',str)<>0) then{Ґб«Ё var ­ЁзҐ©­л©, § ЇЁблў Ґ¬}
var_pos:=line;
procedure_or_function:=(operator_pos('procedure',str)<>0) or (operator_pos('function',str)<>0);
if (var_pos<>0) and procedure_or_function then{Ґб«Ё Ўл« ­ЁзҐ©­л© var Ё ᥩз б procedure/function}
begin
save_error('­Ґ«м§п ЁбЇ®«м§®ў вм Ј«®Ў «м­лҐ ЇҐаҐ¬Ґ­­лҐ',var_pos,no_errors,file_out);{ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ}
var_pos:=0;{§ Ўлў Ґ¬ Ї®§ЁжЁо}
end;
end;
procedure check_strings_size(str:type_str255;line:integer;var no_errors:boolean;var file_out:text);
var
opening_pos,closing_pos:byte;
begin
if operator_pos('string',str)<>0 then{Ґб«Ё ¤ҐЄ« аЁагҐвбп string}
begin
while pos(' ',str)<>0 do{г¤ «Ґ­ЁҐ ўбҐе Їа®ЎҐ«®ў}
delete(str,pos(' ',str),1);
opening_pos:=operator_pos('string',str)+length('string');
closing_pos:=pos_from(']',str,opening_pos);
if (copy(str,opening_pos,1)<>'[') or (closing_pos<=opening_pos+1) then{Ґб«Ё §  б«®ў®¬ string Ё¤Ґв ­Ґ [ Ё«Ё Є®­бвагЄжЁп []}
save_error('бва®ЄЁ ¤®«¦­л Ё¬Ґвм ®ЇаҐ¤Ґ«Ґ­­л© а §¬Ґа',line,no_errors,file_out);{ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ}
end;
end;
procedure check_forbidden_symbols(str:type_str255;line:integer;var no_errors:boolean;var file_out:text);
begin
if (operator_pos('#10',str)<>0) or (operator_pos('#13',str)<>0) or (operator_pos('#7',str)<>0) then{if Ґбвм бЁ¬ў®«л #10,13,7}
save_error('­Ґ«м§п ЁбЇ®«м§®ў вм бЁ¬ў®«л #10,#13 Ё«Ё #7',line,no_errors,file_out);{ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ}
end;

var
file_in,file_out:text;
name_in,name_out:type_filename;
open_successful:boolean;

str:type_str255;
empty:boolean;
comment_rem,comment_algorythm:boolean;
current_line:integer;
no_errors:boolean;
spaces:byte;
tabs_data:type_tabs;
cycle_level:byte;
cycle_variable:type_str255;
var_pos:integer;
i:byte;
operators_count,previous_operators_count:byte;
be_level:byte;
be_line,previous_line:integer;
begin
current_line:=1;
no_errors:=true;
tabs_data.next_level:=0;
tabs_data.child:=false;
tabs_data.topmost:=true;
comment_rem:=false;
comment_algorythm:=false;
cycle_level:=0;
operators_count:=0;
previous_operators_count:=0;
var_pos:=0;
be_level:=0;
be_line:=0;
previous_line:=0;

for i:=0 to max_level do{§ Ї®«­Ґ­ЁҐ ¬ ббЁў  ­г«п¬Ё}
begin
tabs_data.spaces[i]:=0;
tabs_data.collapseto[i]:=0;
tabs_data.collapse[i]:=false;
end;

get_filenames(name_in,name_out);{Ї®«г祭ЁҐ Ё¬Ґ­ д ©«®ў}
open_files(file_in,file_out,name_in,name_out,open_successful);{®вЄалвЁҐ д ©«®ў}
if open_successful then{Ґб«Ё д ©« ­  з⥭ЁҐ бгйҐбвўгҐв, в®}
begin
while not eof(file_in) do{Ї®бва®з­®Ґ з⥭ЁҐ д ©«  б Їа®Ја ¬¬®©}
begin
readln(file_in,str);{з⥭ЁҐ бва®ЄЁ}
clean_string(str,comment_rem,comment_algorythm,empty,spaces);{зЁбвЄ  бва®ЄЁ}

if not empty then{Ґб«Ё бва®Є  ­ҐЇгбв п, в®}
begin
check_operators_count(str,operators_count,previous_operators_count,current_line,no_errors,file_out);{­Ґ Ў®«миҐ 1
®ЇҐа в®а  ­  бва®ЄҐ}
check_tabs(str,spaces,operators_count,previous_operators_count,current_line,tabs_data,no_errors,file_out);{в Ўг«пжЁп}
check_arrays(str,current_line,no_errors,file_out);{­Ґ ®Ўкпў«пвм ¬ ббЁўл Є Є [m,n]}
check_begin_end(str,tabs_data,be_level,be_line,previous_line,current_line,no_errors,file_out);{begin-end ў® ў«®¦Ґ­­ле
®ЇҐа в®а е}
check_cycles(str,cycle_level,tabs_data.level,current_line,no_errors,file_out);{­Ґ ЁбЇ®«м§®ў вм ў«®¦Ґ­­ЁҐ жЁЄ«л}
check_cycle_var(str,cycle_level,cycle_variable,current_line,no_errors,file_out);{­Ґ Ё§¬Ґ­Ґ­пвм бзҐвзЁЄ  ў жЁЄ«Ґ}
check_global_variables(str,tabs_data.child,var_pos,current_line,no_errors,file_out);{­Ґ о§ вм Ј«®Ў «м­лҐ ЇҐаҐ¬Ґ­­лҐ}
check_strings_size(str,current_line,no_errors,file_out);{бва®ЄЁ ¤®«¦­л Ё¬Ґвм в®з­л© а §¬Ґа}
check_forbidden_symbols(str,current_line,no_errors,file_out);{­Ґ«м§п ЁбЇ®«м§®ў вм бЁ¬ў®«л #10,#13 Ё #7}
end;
current_line:=current_line+1;
end;

if no_errors then{Ґб«Ё ®иЁЎ®Є ­Ґв, в®}
writeln(file_out,'Ќ аг襭Ё© Їа®ўҐа塞ле Їа ўЁ« ­Ґв.'){§ ЇЁблў Ґ¬ б®®ЎйҐ­ЁҐ, зв® ўбҐ OK}
else
writeln(file_out,'€бЇа ўЁў ®Ў­ а㦥­­лҐ ®иЁЎЄЁ, Їа®ўҐам⥠Їа®Ја ¬¬г ҐйҐ а § - ®иЁЎ®Є ¬®¦Ґв Ўлвм Ў®«миҐ.');

close_files(file_in,file_out);{§ ЄалвЁҐ д ©«®ў}
writeln('ђ Ў®в  Їа®Ја ¬¬л § ўҐа襭 .');
end
else{Ё­ зҐ}
writeln('” ©« ',name_in,' ­Ґ бгйҐбвўгҐв!');{ўлў®¤Ё¬ ᮮ⢥вбвўго饥 б®®ЎйҐ­ЁҐ}
readln;
end.
Соседние файлы в папке bdz-01