Конечные автоматы и реализация распознавателей на их основе — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Автоматная грамматика для целого со знаком)
(Программа 1 с таблицей переходов)
 
(не показано 13 промежуточных версий этого же участника)
Строка 22: Строка 22:
 
<source lang="Delphi">
 
<source lang="Delphi">
 
// Реализация конечного автомата таблицей
 
// Реализация конечного автомата таблицей
// Beg    - начальное состояние
+
 
 +
// Состояния:
 +
// S      - начальное состояние
 
// A      - после знака
 
// A      - после знака
 
// B      - после цифры
 
// B      - после цифры
// En      - конечное состояние
+
// Fin    - конечное состояние
 
// Err    - состояние ошибки
 
// Err    - состояние ошибки
 +
 +
// Символы:
 
// Digit  - встречена цифра
 
// Digit  - встречена цифра
 
// Sign    - встречен знак
 
// Sign    - встречен знак
 
// Eot    - встречен конец текста
 
// Eot    - встречен конец текста
 
// Unknown - встречен неизвестный символ
 
// Unknown - встречен неизвестный символ
 
+
 
type
 
type
   States = (Beg,A,B,En,Err);
+
   States = (S,A,B,Fin,Err);
 
   KindCh = (Digit, Sign, Eot, Unknown);
 
   KindCh = (Digit, Sign, Eot, Unknown);
 
+
 
function Kind(ch: char): KindCh;
 
function Kind(ch: char): KindCh;
 
begin
 
begin
Строка 45: Строка 49:
 
   end;
 
   end;
 
end;   
 
end;   
 
+
var P: array [Beg..B,Digit..Unknown] of States :=
+
var P: array [S..B,Digit..Unknown] of States :=
 
   ((B, A, Err, Err),
 
   ((B, A, Err, Err),
 
   (B, Err, Err, Err),
 
   (B, Err, Err, Err),
   (B, Err, En, Err));
+
   (B, Err, Fin, Err));
 
+
 
procedure error();
 
procedure error();
 
begin
 
begin
Строка 56: Строка 60:
 
   halt;
 
   halt;
 
end;
 
end;
 
+
 
var  
 
var  
 
   ch: Char;
 
   ch: Char;
 
   State: States := Beg;
 
   State: States := Beg;
 
begin
 
begin
 +
  write('Введите целое со знаком: ');
 
   read(ch);
 
   read(ch);
   while (State<>En) and (State<>Err) do
+
  writeln('Состояния:');
 +
   while (State<>Fin) and (State<>Err) do
 
   begin
 
   begin
 
     writeln(State);
 
     writeln(State);
Строка 70: Строка 76:
 
   writeln(State);
 
   writeln(State);
 
end.</source>
 
end.</source>
 
=====Граф автоматной грамматики идентификаторов=====
 
[[Изображение:Id.png|Граф автоматной грамматики идентификаторов]]
 
  
 
====Задания к теме 1 «Конечные автоматы и реализация распознавателей на их основе»====
 
====Задания к теме 1 «Конечные автоматы и реализация распознавателей на их основе»====
 +
=====Общее=====
 +
# Реализовать программу 1. Проверить, верно ли она распознает целое без знака. Если верно, формировать соответствующее целое со знаком.
 +
# Назвать состояния ошибок Err1, Err2 и т.д. В зависимости от типа ошибки выдавать диагностику. Предусмотреть диагностики вида: "Неверный символ", "Знак + не может содержаться внутри целого", "После целого не может быть других символов"
 +
# В программе 1 попытаться восстановиться после ошибки, возвращаясь в предыдущее состояние и выводя предупреждение с местом ошибки и неверным символом
 +
# Выдавать место ошибки в виде
 +
+123+
 +
    ^
 +
Знак + не может содержаться внутри целого
  
# Реализовать программу 1. Проверить, верно ли она распознает целое без знака. Если верно, формировать соответствующее целое со знаком.Сделать все варианты ошибок.
+
=====Индивидуальные задания=====
# Назвать состояния ошибок Err1, Err2 и т.д. В зависимости от типа ошибки выдавать диагностику. Предусмотреть диагностики вида: "Неверный символ", "Знак + не может содержаться внутри целого", "После целого не может быть других символов"
 
# Составить таблицу конечного автомата для распознавания идентификаторов. Проверить работу программы в случае правильного и неправильного ввода. Выводить разную диагностику в зависимости от типа ошибки.
 
 
# Нарисовать граф автоматной грамматики для целого со знаком, начинающегося не с цифры 0. Реализовать конечный автомат. Оттестировать.
 
# Нарисовать граф автоматной грамматики для целого со знаком, начинающегося не с цифры 0. Реализовать конечный автомат. Оттестировать.
 
# Нарисовать граф автоматной грамматики для чередующихся букв и цифр. Реализовать конечный автомат. Оттестировать.
 
# Нарисовать граф автоматной грамматики для чередующихся букв и цифр. Реализовать конечный автомат. Оттестировать.
Строка 85: Строка 94:
 
# Нарисовать граф автоматной грамматики для выражения вида 1+2-3-4+5. Реализовать конечный автомат. Оттестировать.
 
# Нарисовать граф автоматной грамматики для выражения вида 1+2-3-4+5. Реализовать конечный автомат. Оттестировать.
 
# Нарисовать граф автоматной грамматики для вещественного с десятичной точкой 123.45678. Реализовать конечный автомат. Оттестировать.
 
# Нарисовать граф автоматной грамматики для вещественного с десятичной точкой 123.45678. Реализовать конечный автомат. Оттестировать.
# В программе 1 попытаться восстановиться после ошибки, возвращаясь в предыдущее состояние и выводя предупреждение с местом ошибки и неверным символом
+
# Составить таблицу конечного автомата для распознавания идентификаторов. Проверить работу программы в случае правильного и неправильного ввода. Выводить разную диагностику в зависимости от типа ошибки.
 +
 
 +
Для задания 7
 +
=====Граф автоматной грамматики идентификаторов=====
 +
[[Изображение:Id.png|Граф автоматной грамматики идентификаторов]]

Текущая версия на 10:19, 14 февраля 2013

К основной странице курса

Основные определения

Тема 1. Конечные автоматы и реализация распознавателей на их основе

Правая автоматная грамматика для целого со знаком
Beg -> +A | -A | цB
A -> цB
B -> цB | ε
Граф автоматной грамматики для целого со знаком

Граф автоматной грамматики целого со знаком

Регулярное выражение для целого со знаком
(+|-|)ц+
Программа 1 с таблицей переходов
// Реализация конечного автомата таблицей

// Состояния:
// S       - начальное состояние
// A       - после знака
// B       - после цифры
// Fin     - конечное состояние
// Err     - состояние ошибки

// Символы:
// Digit   - встречена цифра
// Sign    - встречен знак
// Eot     - встречен конец текста
// Unknown - встречен неизвестный символ
 
type
  States = (S,A,B,Fin,Err);
  KindCh = (Digit, Sign, Eot, Unknown);
 
function Kind(ch: char): KindCh;
begin
  case ch of
'0'..'9':   Result := Digit;
'+','-':    Result := Sign;
#13,#10:    Result := Eot;
  else   Result := Unknown; 
  end;
end;  
 
var P: array [S..B,Digit..Unknown] of States :=
  ((B, A, Err, Err),
   (B, Err, Err, Err),
   (B, Err, Fin, Err));
 
procedure error();
begin
  writeln('error');
  halt;
end;
 
var 
  ch: Char;
  State: States := Beg;
begin
  write('Введите целое со знаком: ');
  read(ch);
  writeln('Состояния:');
  while (State<>Fin) and (State<>Err) do
  begin
    writeln(State);
    State := P[State,Kind(ch)];
    read(ch);
  end;
  writeln(State);
end.

Задания к теме 1 «Конечные автоматы и реализация распознавателей на их основе»

Общее
  1. Реализовать программу 1. Проверить, верно ли она распознает целое без знака. Если верно, формировать соответствующее целое со знаком.
  2. Назвать состояния ошибок Err1, Err2 и т.д. В зависимости от типа ошибки выдавать диагностику. Предусмотреть диагностики вида: "Неверный символ", "Знак + не может содержаться внутри целого", "После целого не может быть других символов"
  3. В программе 1 попытаться восстановиться после ошибки, возвращаясь в предыдущее состояние и выводя предупреждение с местом ошибки и неверным символом
  4. Выдавать место ошибки в виде
+123+
    ^
Знак + не может содержаться внутри целого
Индивидуальные задания
  1. Нарисовать граф автоматной грамматики для целого со знаком, начинающегося не с цифры 0. Реализовать конечный автомат. Оттестировать.
  2. Нарисовать граф автоматной грамматики для чередующихся букв и цифр. Реализовать конечный автомат. Оттестировать.
  3. Нарисовать граф автоматной грамматики для списка букв, разделенных символом , или ;. Реализовать конечный автомат. Оттестировать.
  4. Нарисовать граф автоматной грамматики для списка цифр, разделенных одним или несколькими пробелами. Реализовать конечный автомат. Оттестировать.
  5. Нарисовать граф автоматной грамматики для выражения вида 1+2-3-4+5. Реализовать конечный автомат. Оттестировать.
  6. Нарисовать граф автоматной грамматики для вещественного с десятичной точкой 123.45678. Реализовать конечный автомат. Оттестировать.
  7. Составить таблицу конечного автомата для распознавания идентификаторов. Проверить работу программы в случае правильного и неправильного ввода. Выводить разную диагностику в зависимости от типа ошибки.

Для задания 7

Граф автоматной грамматики идентификаторов

Граф автоматной грамматики идентификаторов