Программа реализации конечного автомата, распознающего целое число

Материал из Вики ИТ мехмата ЮФУ
Версия от 20:09, 8 февраля 2012; Admin (обсуждение | вклад) (Граф автоматной грамматики идентификаторов)

Перейти к: навигация, поиск

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

Регулярное выражение для целого со знаком

(+|-|)ц+

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

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

Программа с таблицей переходов

// Реализация конечного автомата таблицей
// Beg     - начальное состояние
// A       - после знака
// B       - после цифры
// En      - конечное состояние
// Err     - состояние ошибки
// Digit   - встречена цифра
// Sign    - встречен знак
// Eoln    - встречен конец ввода
// Unknown - встречен неизвестный символ

type
  States = (Beg,A,B,En,Err);
  KindCh = (Digit, Sign, Eoln, Unknown);
  
function Kind(ch: char): KindCh;
begin
  case ch of
'0'..'9':   Result := Digit;
'+','-':    Result := Sign;
#13,#10:    Result := Eoln;
  else   Result := Unknown; 
  end;
end;  

var P: array [Beg..B,Digit..Unknown] of States :=
  ((B, A, Err, Err),
   (B, Err, Err, Err),
   (B, Err, En, Err));

procedure error();
begin
  writeln('error');
  halt;
end;

var 
  ch: Char;
  State: States := Beg;
begin
  read(ch);
  while (State<>En) and (State<>Err) do
  begin
    writeln(State);
    State := P[State,Kind(ch)];
    read(ch);
  end;
  writeln(State);
end.

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

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

Задания.

  1. Реализовать программу 1. Проверить, верно ли она распознает целое без знака. Если верно, формировать соответствующее целое со знаком.Сделать все варианты ошибок.
  2. Назвать состояния ошибок Err1, Err2 и т.д. В зависимости от типа ошибки выдавать диагностику.

Программа с заменой таблицы переходов условными операторами

Синтаксическая диаграмма - нарисовать

// Вместо таблицы - условные операторы
procedure error();
begin
  writeln('error');
  halt;
end;

var ch: Char;

begin
  var s: string := '';

  read(ch);
  if ch in ['+','-'] then
    read(ch);
    
  if ch in ['0'..'9'] then
    read(ch)
  else error;
  
  while ch in ['0'..'9'] do
    read(ch);
  
  if ch<>#13 then
    error;
    
  writeln('Распознано целое число');
end.
Задания 1
  1. Реализовать программу 1
  2. Попытаться восстановиться после ошибки, возвращаясь в предыдущее состояние и выводя предупреждение с местом ошибки и неверным символом
Задания 2
  1. Реализовать программу 2
  2. Реализовать в программе 2 семантические действия по накоплению в строке распознанного целого числа и преобразованию его в целое в конце разбора (при встрече завершающего символа)
  3. Построить автоматную грамматику для идентификаторов.
  4. По данной грамматике построить граф грамматики, представляющий ДКА, и реализовать анализатор с помощью таблицы
  5. Преобразовать граф грамматики в синтаксическую диаграмму и построить программу разбора без использования таблицы
  6. Построить автоматную грамматику для распознавания вещесивенных и синтаксическую диаграмму для нее