2013-02-07 22 views
7

Sto lavorando ad un piccolo progetto Haskell che deve essere in grado di simulare un sottogruppo molto piccolo di token rigorosamente formato in token per l'analisi semantica. È un'interfaccia di linguaggio naturale molto ingenuo per un sistema con molti effetti finali diversi rispetto ai comandi che possono essere emessi. Attualmente sto usando Alex per questo, ma Alex si basa sul suo lessico per essere compilato staticamente. La natura del sistema è tale che il numero e persino il tipo di endorsor nel mondo può aumentare o diminuire dopo la compilazione, e quindi devo essere in grado di aggiungere o rimuovere i token vitali dal lessico in fase di runtime.Esistono soluzioni off-the-shelf per l'analisi lessicale in Haskell che consentono un lessico dinamico run-time?

Ho provato a cercare in giro per le soluzioni Lexing dinamiche, e il più vicino ho potuto ottenere era this dinamica Lexer motore che non sembra essere stato aggiornato dal 2000.

Ho preso in considerazione alcune tecniche come utilizzando un approccio di livello inferiore (Attoparsec, forse), o addirittura collegando un hook di ricompilazione per Alex e separando il lexer dal resto dell'applicazione.

Esistono soluzioni note per questo tipo di analisi lessicale? Intendo lavorare su Natural Language Processing for the Working Programmer alla fine così posso adottare un approccio meno semplificato, ma attualmente un lexer fondamentalmente è quello di cui ho bisogno.

+1

Quanto di un problema è la prestazione? Posso immaginare alcune soluzioni molto semplici, a seconda che tu abbia bisogno di una grande quantità di efficienza o meno. – sclv

+0

@sclv Le prestazioni devono essere vicine in tempo reale (nel senso di reattività, non nel senso del determinismo). –

+1

Quel Dynamic Lexer Engine non è cattivo automaticamente solo perché non è stato aggiornato da molto tempo. Forse è già perfetto e non ha bisogno di essere aggiornato. :) –

risposta

4

CTK è un equivalente di parsec ma per lexing. Supporta l'aggiunta di nuovi combinatori in modo dinamico.