Автор: Пользователь скрыл имя, 15 Сентября 2012 в 17:08, лабораторная работа
Создание в среде Pascal программы, которая определяет правильно ли описаны переменные языка Паскаль во входном файле input.txt
1. Задание
1.1 Входные данные
1.2 Выходные данные
2. Краткая теория
3. Результаты работы программы
4. Выводы
Список литературы
Приложение.
err_line:=line;
err_pos:=err_pos+position;
if (not aft_dots) and (not aft_str) then
err_name:='Ожидается ".."'
else
if aft_str then
err_name:='Ожидается "]", а найдено '+'"'+lines[err_line][err_pos]
else
err_name:='Ожидается "," или "]", а найдено '+'"'+lines[err_line][err_pos]
check:=false;
exit;
end;
end;
end;
BRECKET_2:
begin
if (lines[line][position]=';') and (not is_array) then //Если не идет объявления массива
begin
prev_pos:=SEMICOLON;
position:=position+1;
check(lines[line]);
exit;
end
else
if (UpCase(lines[line][position])
begin
if UpperCase(get_str) = 'OF' then
begin
prev_pos:=COLON;
is_array:=false;
check(lines[line]);
exit;
end
else
goto else_p_brecket_2;
end
else
else_p_brecket_2: begin
err_line:=line;
err_pos:=err_pos+position;
if not is_array then
err_name:='Ожидается ";", а найдено '+'"'+lines[err_line][err_pos]
else
err_name:='Ожидается "of", а найдено '+'"'+lines[err_line][err_pos]
check:=false;
exit;
end
end;
VAR_TYPE :
begin
if (lines[line][position] = '[') and (aft_str) then
begin
prev_pos:=BRECKET_1;
startP:='';
position:=position+1;
check(lines[line]);
exit;
end
else
if lines[line][position] = ';' then
begin
prev_pos:=SEMICOLON; //unexp_end:=false;
position:=position+1;
check(lines[line]);
exit;
end
else
begin
err_line:=line;
err_pos:=err_pos+position;
if aft_str then
err_name:='Ожидается "[" или ";", а найдено '+'"'+lines[err_line][err_pos]
else
err_name:='Ожидается ";", а найдено '+'"'+lines[err_line][err_pos]
check:=false;
exit;
end;
end;
end;
end;
//----------Начало программы----------//
begin
err_name:='Ошибок не обнаружено';
assignfile(input,'input.txt');
reset(input);
line:=0;
while not EOF(input) do //Ищем начало объявлений
begin
line:=line+1; //увеличиваем счетчик строк на 1
setlength(lines,line+1); //Устанавливаем размер массива
readln(input,lines[line]); //считываем строку
j:=1;
while (not symb(lines[line][j])) and
(lines[line][j]<>#13) and
(lines[line][j]<>#10) do j:=j+1;
if (lines[line][j]=#13) or
(lines[line][j]=#10) then
continue;
while symb(lines[line][j]) do
begin
var_str:=var_str+lines[line][
j:=j+1;
end;
if (UpperCase(var_str)='VAR') and (( separator(lines[line][j]) or
(lines[line][j]=#10) or
(lines[line][j]=#13) ) and //следующий за ним символ - разделитель
( (separator(lines[line][j-
(lines[line][j-length(var_str)
(lines[line][j-length(var_str)
(lines[line][j-length(var_str)
begin
position:=j;
break; //выходим из цикла - while
end;
end;
prev_pos:=SEMICOLON;
if check(lines[line]) then //Можно попробовать убрать фроверку отсюда и просто начинать следующий цикл с этого кода
is_error:=false //Но возникает проблема.
else
is_error:=true;
if err_name='Ошибок не обнаружено' then //Почему нужна эта проверка не знаю, но без нее не работало
is_error:=false;
while (not eof(input)) and (not is_error) do //Если не конец файла и не ошибка
begin
line:=line+1; //увеличиваем счетчик строк на 1
setlength(lines,line+1);
readln(input,lines[line]); //считываем строку
position:=1;
err_pos:=0;
if check(lines[line]) then //Проверка должна быть именно здесь, если ее поместить в начале цикла, то последняя строка небудет проверятся, т.к. обнаружится "OEF" - конец файла
is_error:=false
else
if err_name<>'Ошибок не обнаружено' then //Почему нужна эта проверка не знаю, но без нее не работало
begin
is_error:=true;
break;
end
else is_error:=false;
end;
if ((prev_pos <> SEMICOLON) or (unexp_end)) and (not is_error) then
begin
err_line:=line;
err_pos:=position;
err_name:='Неожиданный конец файла';
end;
close(input);
assignfile(output,'output.txt'
Rewrite(output);
writeln(output,err_name);
if err_name<>'Ошибок не обнаружено' then
writeln(output,'В позиции: '+IntToStr(err_line)+':'+
close(output);
end.