2013-02-07 23 views
7

Pracuję nad małym projektem Haskella, który musi być w stanie bardzo niewielkim podzbiorem ściśle uformowanego języka angielskiego na tokeny do semantycznego parsowania. Jest to bardzo naiwny interfejs języka naturalnego do systemu z wieloma różnymi efektorami końcowymi niż polecenia wydawane. Obecnie używam do tego Alexa, ale Alex polega na tym, że jego słownik jest statycznie skompilowany. Natura systemu jest taka, że ​​liczba i nawet rodzaj efektorów końcowych na świecie może wzrastać i maleć po kompilacji, więc muszę mieć możliwość dodawania lub usuwania żywotnych tokenów z leksykonu w czasie wykonywania.Czy istnieją jakieś gotowe rozwiązania do analizy leksykalnej w Haskell, które pozwalają na stosowanie dynamicznego leksykonu w czasie wykonywania?

Próbowałem rozglądać się za dynamicznych rozwiązań Lexing, a najbliżej mogę dostać było this Dynamiczny Lexer silnik, który nie wygląda na zostały zaktualizowane od 2000.

byłem rozważa kilka technik, takich jak używając podejścia mniej wysokiego poziomu (być może Attoparsec), a nawet podłączając rekombinację Alexa i oddzielając lexera od reszty aplikacji.

Czy są jakieś dobrze znane rozwiązania tego rodzaju analizy leksykalnej? Zamierzam w końcu przejść przez Natural Language Processing for the Working Programmer, więc mogę przyjąć mniej uproszczone podejście, ale obecnie zasadniczo potrzebuję leksykonu.

+1

Ile problemu stanowi wydajność? Mogę sobie wyobrazić bardzo proste rozwiązania, w zależności od tego, czy potrzebujesz dużej wydajności, czy nie. – sclv

+0

@sclv Wydajność musi być bliska czasie rzeczywistym (w sensie responsywności, a nie determinizmu). –

+1

Ten dynamiczny silnik Lexer nie jest automatycznie zły tylko dlatego, że nie był aktualizowany od dłuższego czasu. Może to już jest doskonałe i nie trzeba go aktualizować. :) –

Odpowiedz

4

CTK jest odpowiednikiem parsetu, ale do leksykowania. Obsługuje dynamicznie dodawanie nowych kombinatorów.