{"issue":{"user":{"id":1055241,"login":"filipg","url":"https://api.github.com/users/filipg","gravatar_id":"3eae35237b5c224a29148e6debacb5f9","avatar_url":"https://secure.gravatar.com/avatar/3eae35237b5c224a29148e6debacb5f9?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png"},"milestone":{"creator":{"id":1055241,"login":"filipg","url":"https://api.github.com/users/filipg","gravatar_id":"3eae35237b5c224a29148e6debacb5f9","avatar_url":"https://secure.gravatar.com/avatar/3eae35237b5c224a29148e6debacb5f9?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png"},"open_issues":7,"created_at":"2011-11-30T07:25:35Z","title":"Zajęcia XII","state":"open","due_on":"2011-12-14T08:00:00Z","closed_issues":0,"number":11,"description":"","url":"https://api.github.com/repos/filipg/amu_automata_2011/milestones/11"},"created_at":"2011-11-30T07:18:54Z","title":"Opracować zarządcę operatorów","updated_at":"2011-12-22T14:36:29Z","labels":[{"name":"8 punktów","url":"https://api.github.com/repos/filipg/amu_automata_2011/labels/8+punkt%C3%B3w","color":"DDDDDD"},{"name":"assigned","url":"https://api.github.com/repos/filipg/amu_automata_2011/labels/assigned","color":"02e10c"},{"name":"being-tested","url":"https://api.github.com/repos/filipg/amu_automata_2011/labels/being-tested","color":"02d7e1"},{"name":"regexps","url":"https://api.github.com/repos/filipg/amu_automata_2011/labels/regexps","color":"e102d8"},{"name":"tester-assigned","url":"https://api.github.com/repos/filipg/amu_automata_2011/labels/tester-assigned","color":"02e10c"}],"state":"open","id":2398242,"pull_request":{"patch_url":null,"html_url":null,"diff_url":null},"html_url":"https://github.com/filipg/amu_automata_2011/issues/348","closed_at":null,"number":348,"body":"Tzn. klasę `RegexpOperatorManager`, która będzie trzymać informacje o dostępnych operatorach, klasa ma mieć następujące metody:\r\n\r\n     /**\r\n      * Dodaje fabrykę operatorFactory danego operatora. Napis id będzie identyfikatorem (nazwą) operatora.\r\n      * Lista separators będzie listą napisów oddzielających argumenty i parametry, lista ta musi mieć\r\n      * długość równą sumie liczby argumentów i parametrów powiększoną o jeden. Pierwszy i ostatni element \r\n      * listy separators może być napisem pustym. Np. dla operatora `KleeneStarOperator` i tradycyjnego zapisu\r\n      * wyrażeń regularnych separators będzie listą dwuelementową, pierwszym elementem będzie napis pusty, \r\n      * drugim - napis \"*\". Z kolei dla operatora RangeNumberOfOccurrencesOperator pierwszym elementem będzie \r\n      * napis pusty, drugim - napis \"{\", trzecim - napis \",\", czwartym - napis \"}\" (operator ma jeden argument i\r\n      * dwa parametry).\r\n      *\r\n      * Identyfikator operatora jest dowolnym napisem, zwykle będziemy jakoś wykorzystywać któryś z separatorów\r\n      *  (ale nie jest to obowiązkowe), np. dobrym identyfikatorem KleeneStarOperator będzie gwiazdka.\r\n      *\r\n      * Priority to priorytet operatora.\r\n      */\r\n     void addOperator(String id, RegexpOperatorFactory operatorFactory, List<String> separators, int priority);\r\n\r\n      /**\r\n       * Zwraca listę separatorów dla operatora o identyfikatorze id.\r\n       */\r\n     List<String> getSeparators(String id);\r\n\r\n     /**\r\n      * Zwraca fabrykę operatora o identyfikatorze id.\r\n      */\r\n     RegexpOperatorFactory getFactory(String id);\r\n       \r\n     /**\r\n      * Zwraca priorytet operatora id.\r\n      */\r\n     int getPriority(String id);\r\n\r\n     /**\r\n      * Zwraca listę identyfikatorów operatorów, których pierwszy separator to najdłuższy prefiks napisu s.\r\n      * Jeśli żaden niepusty prefiks napisu s nie jest pierwszym separatorem, wówczas powinna zwrócić\r\n      * listę wszystkich operatorów, których pierwszy separator jest napisem pustym.\r\n      */\r\n     List<String> getOperatorsForStringPrefix(String s);\r\n\r\nPrzykład użycia:\r\n    \r\n     RegexpOperatorManager manager = new RegexpOperatorManager();\r\n     manager.addOperator(\"*\", new KleeneStarOperator.Factory(), Arrays.<String>asList(\"\", \"*\"));\r\n     manager.addOperator(\"{n,m}\", new KleeneStarOperator.Factory(), Arrays.<String>asList(\"\", \"{\", \",\", \"}\"));\r\n     manager.addOperator(\"()\", new DoNothingOperator.Factory(), Arrays.<String>asList(\"(\", \")\"));\r\n\r\nOprócz opracowania samej klasy `RegexpOperatorManager` należy:\r\n    \r\n   * dodać klasy `NullaryRegexpOperatorFactory` i `BinaryRegexpOperatorFactory` (na wzór i podobieństwo `UnaryRegexpOperatorFactory`),\r\n   * do poszczególnych operatorów dodać podklasę `Factory` (zob. przykład w `KleeneStarOperator`).\r\n     \r\nZadanie jest specyficzne: mało algorytmiki, trochę spraw technicznych, javowych, ale w sumie nie jest trudne.\r\n","url":"https://api.github.com/repos/filipg/amu_automata_2011/issues/348","comments":20,"assignee":null},"comment":{"user":{"id":1055241,"login":"filipg","url":"https://api.github.com/users/filipg","gravatar_id":"3eae35237b5c224a29148e6debacb5f9","avatar_url":"https://secure.gravatar.com/avatar/3eae35237b5c224a29148e6debacb5f9?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png"},"created_at":"2011-12-22T14:36:29Z","updated_at":"2011-12-22T14:36:29Z","id":3249602,"body":"Jeszcze dwie sprawy:\r\n\r\n   * `getOperatorsForStringPrefix` jest nieefektywne, w pierwszej pętli lepiej zrobić tak: do `potentialOperators` dodawać `firstSeparator`, jeśli jest równy najdłuższemu do tej pory znalezionemu, natomiast jeśli `firstSeparator` jest dłuższy niż najdłuższy napotkany do tej pory, można wyczyścić `potentialOperators`i dodać `firstSeparator` jako pierwszy element; w ten sposób nawet przypadku, gdy `firstSeparator` jest napisem pustym, nie trzeba będzie rozpatrywać jako przypadku szczególnego;\r\n   * `else return null/-1` wygląda nienaturalnie, lepiej złamać wiersz:\r\n\r\n        else\r\n            return null","url":"https://api.github.com/repos/filipg/amu_automata_2011/issues/comments/3249602"},"action":"created"}