2013-03-16 16 views
5

Pracuję nad projektem, gdzie użytkownik wprowadza czytelnej wyszukiwarki ciąg z I LUB operatorów. daję trzy przykładywejściowe użytkownika Konwersja do regex

  1. a i (B i C) -> (= \ ba \ B?). (= (\ BB \ b) |?. (\ Bc \ b)). *
  2. a lub (b i C)
  3. (A lub b) i (C i d)

powyżej to próbki wejściowe I może dostać. Chcę wziąć to wejście i przekonwertować je na wyrażenie regularne. Czy to nie jest próbka kompilatora? Patrząc na to, widzę , co chcę zrobić, to przekonwertować komendę wysokiego poziomu na niski poziom. Czy masz jakieś sugestie na temat , w jaki sposób mogę osiągnąć powyższe? Czego chcę, należy przekazać regex do jsoup (pseudo selector: matchesOwn) i wysłać zapytanie do dokumentu HTML. Dziękuję za pomoc.

+0

Jeśli masz gniazdowania wsporniki jak to '(()()) ((())())', nie można analizować je z regex w Java. – nhahtdh

+0

Dziękuję za odpowiedź. Nie chcę analizować danych wejściowych za pomocą wyrażenia regularnego, chcę je przekonwertować na wyrażenie regularne. Zamiast prosić użytkownika o wyrażenie regex, proszę go o bardziej czytelną dla człowieka wersję. – alkis

+0

Jak radzić sobie z faktem, że wyrażenia regularne mają porządek, ale ciągi wyszukiwania nie. jeśli użytkownik wejdzie w 'foo AND bar', oczekuje, że' bar foo' będzie pasował do tego, którego przykładu nie użyjesz. Czy też będziesz generował każdą permutację. – user1937198

Odpowiedz

5

Ogólny sposób wykonania tej operacji polega na utworzeniu reprezentacji pośredniej w postaci łatwo przeszukiwalnej struktury danych. Nazywa się to zwykle AST. Jeśli nie znasz tej koncepcji, spójrz na calculator-ast, która wykonuje tę transformację dla języka kalkulatora.

Aby przekształcić ciągi wejściowe użytkownika w AST, należy użyć analizatora składni. Możesz rzucić okiem na Antlr. Osobiście używam v3, v4 wydaje się być mniej dojrzały. Spójrz na antlr3.org. Jeśli chcesz sam napisać parser, możesz zrobić zdjęcie strzałem w stylu pratt parser. To nie jest trywialne i włączenie ładnej obsługi błędów wymaga czasu, ale może być zabawnym ćwiczeniem.

Po uzyskaniu AST, zamienienie go w wyrażenie regularne powinno być trywialne, przechodząc przez AST i wysyłając znaki w miarę postępów.

Powodzenia!

+0

Twoja odpowiedź jest bardzo pomocna. Tak więc, w bardzo abstrakcyjny sposób myślenia, maleńki kompilator ... – alkis

+2

Tak! A takie małe języki są świetnym sposobem na zapoznanie się z technologiami i terminologią kompilatora. Baw się dobrze. –