Вот пример реального конечного автомата на языке C#. Это лексер, он разбивает программы текст на слова.
Вложение:
automaton.png [ 44.87 КБ | Просмотров: 13979 ]
Пример текста, который может разобрать данный лексер:
Код:
var foo = bar.SomeMethod(n + 10/x);
На что похож код, который генерирует DRAKON Editor для автоматов?
В итоге получается класс следующего вида:
Код:
class Lexer
{
public void Whitespace(char c);
public void Letter(char c);
public void Digit(char c);
public void Operator(char c);
}
У него есть четыре метода, которые соответствуют типам сообщений. Данный автомат поддерживает только эти типы сообщений:
- Whitespace
- Letter
- Digit
- Operator
То, какой именно код выполняется при получении конкретного типа сообщения, зависит от текущего состояния автомата.
Данный автомат может находиться в одном из следующих состояний:
- Idle
- Identifier
- Number
- Operator
Откуда что берётся?
Состояния задаются ветками силуэта. Каждая ветка силуэта, кроме последней, задаёт:
- имя состояния (название ветки).
- Поведение (алгоритмическое содержание ветки).
Последняя ветка нужна только из-за того, что код редактора требует этого.
Никакие ветки не должны указывать на неё.
Самой первой иконой в ветке-состоянии должна быть икона "выбор". Она должна содержать текст "receive".
Типы сообщений определяются иконами "вариант", которые находятся сразу под "receive".
Вот например:
Вложение:
auto_all.png [ 3.99 КБ | Просмотров: 13979 ]
В какой-то из веток для некоторого типа сообщений может не быть соответствующей "выбор".
Тогда возможны два варианта:
1. Под иконой "выбор" с "receive" нет пустой иконы "вариант" (вариант по умолчанию отсутствует).
Тогда в случае вызова метода с именем, для которого нет иконы "выбор", будет брошено исключение.
Смысл этого следующий: автомат не принимает данный тип сообщения в данном состоянии.
Вложение:
auto_error.png [ 3.76 КБ | Просмотров: 13979 ]
В этом примере при вызове метода Operator будет брошено исключение. (Предполагается, что тип сообщения Operator присутствует в других ветках-состояниях).
2. Под иконой "выбор" с "receive" есть пустая икона "вариант" (вариант по умолчанию присутствует).
Тогда выполняется код по умолчанию.
Смысл этого - "для сообщений всех остальных типов сделать то-то".
Вложение:
auto_default.png [ 3.65 КБ | Просмотров: 13979 ]
В этом примере при вызове методов Digit и Operator будет выполнен алгоритм по умолчанию. (Предполагается, что типы сообщения Digit и Operator присутствует в других ветках-состояниях).
Сигнатура (список принимаемых параметров) методов обработки сообщений берётся из иконы "формальные параметры".
Вложение:
auto_signature.png [ 3.35 КБ | Просмотров: 13979 ]
Например:
Код:
int a
string b
SomeClass c
Это даст следующую сигнатуру:
Код:
public void Foo(int a, string b, SomeClass c);
У всех методов, которыми автомат принимает сообщения, сигнатура одна и та же.
Как указать, что диаграмма описывает автомат?Для этого диаграмма должна иметь имя "state machine".
В одном файле может быть только одна диаграмма с таким именем. А значит, и только один конечный автомат на класс.
Смотри примеры в папке examples/automaton в дистрибутиве программы.