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

Материал из Вики ИТ мехмата ЮФУ
Версия от 20:38, 12 февраля 2011; Admin (обсуждение | вклад) (Новая страница: «=====Программа с таблицей переходов===== <source lang="Delphi"> // Реализация конечного автомата таблице…»)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Программа с таблицей переходов
// Реализация конечного автомата таблицей
// 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.
Программа с заменой таблицы переходов условными операторами
// Вместо таблицы - условные операторы
procedure error();
begin
  writeln('error');
  halt;
end;

var ch: Char;

begin
  var s: string := '';
  read(ch);
  while not (ch=#13) do
  begin
    if ch in ['+','-'] then
    begin
      // A
      s += ch;
      // end A
      read(ch);
      if ch in ['0'..'9'] then
      begin
        // B
        s += ch;
        // end B
        read(ch)
      end  
      else error;  
    end
    else if ch in ['0'..'9'] then
    begin
      // B
      s += ch;
      // end B
      read(ch)
    end
    else error;
  end;
  writeln('Распознано число: ',s);
end.