Добавил:
Hist
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Паскаль (I семестр) / K01-172 / bdz-01 / zolot64
.pas {$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.
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.