filipg/amu_automata_2011 — Issue #348: Opracować zarządcę operatorów
Author: filipg
Created: 2011-11-30 07:18:54+00:00
State: open

Tzn. klasę `RegexpOperatorManager`, która będzie trzymać informacje o dostępnych operatorach, klasa ma mieć następujące metody:

/**
* Dodaje fabrykę operatorFactory danego operatora. Napis id będzie identyfikatorem (nazwą) operatora.
* Lista separators będzie listą napisów oddzielających argumenty i parametry, lista ta musi mieć
* długość równą sumie liczy argumentów i parametrów powiększoną o jeden. Pierwszy i ostatni element
* listy separators może być napisem pustym. Np. dla operatora `KleeneStarOperator` i tradycyjnego zapisu
* wyrażeń regularnych separators będzie listą dwuelementową, pierwszym elementem będzie napis pusty,
* drugim - napis "*". Z kolei dla operatora RangeNumberOfOccurrencesOperator pierwszym elementem będzie
* napis pusty, drugim - napis "{", trzecim - napis ",", czwartym - napis "}" (operator ma jeden argument i
* dwa parametry).
*
* Identyfikator operatora jest dowolnym napisem, zwykle będziemy jakoś wykorzystywać któryś z separatorów
* (ale nie jest to obowiązkowe), np. dobrym identyfikatorem KleeneStarOperator będzie gwiazdka.
*/
void addOperator(String id, RegexpOperatorFactory operatorFactory, List separators);

/**
* Zwraca listę separatorów dla operatora o identyfikatorze id.
*/
List getSeparators(String id);

/**
* Zwraca fabrykę operatora o identyfikatorze id.
*/
RegexpOperatorFactory getFactory(String id);

/**
* Zwraca listę identyfikatorów operatorów, których pierwszy separator to najdłuższy prefiks napisu s.
* Jeśli żaden niepusty prefiks napisu s nie jest pierwszym separatorem, wówczas powinna zwrócić
* listę wszystkich operatorów, których pierwszy separator jest napisem pustym.
*/
List getOperatorsForStringPrefix(String s);

Oprócz opracowania samej klasy `RegexpOperatorManager` należy:

* dodać klasy `NullaryRegexpOperatorFactory` i `BinaryRegexpOperatorFactory` (na wzór i podobieństwo `UnaryRegexpOperatorFactory`),
* do poszczególnych operatorów dodać podklasę `Factory` (zob. przykład w `KleeneStarOperator`).