2010-08-18 15 views
8

Ho una definizione per un file SPAN (http://www.cme-ch.com/span/spanl300.htm) che mi piacerebbe utilizzare nella costruzione di un parser per analizzare i dati di stringa in una raccolta in memoria classe (o anche usando una valutazione lenta con la parola chiave yield).Creazione di un parser generico per la conversione di un file di testo in una struttura dati in C#

Tutte le tecniche di analisi e le librerie che ho visto si applicano alla costruzione di alberi di analisi per l'implementazione delle lingue; Mi piacerebbe semplicemente sapere delle buone tecniche da analizzare in una struttura dati, simile a come XML viene analizzato in un XMLDocument nel framework .net, ma usando le regole definite da SPAN.

risposta

2

SPAN sembra essere un gruppo di tipi di record, ogni record con molti dettagli.

Dovrebbe essere semplice da definire una grammatica classico che copre tutti i record (come nonterminali), in termini di qualsiasi sottorecord (come nonterminals) ei tipi di dati terminali rappresentano i vari tipi di dati definiti da SPAN. Potrebbero esserci molti non terminali, ma ciò rende solo una grammatica grande, ma non uno complicato.

La maggior parte dei linguaggi di programmazione ha un piccolo set di token terminali che generalmente possono apparire ovunque. La verità è che le grammatiche definiscono le aspettative su ciò che può apparire dopo (chiamate "first" e "follow" nella letteratura del parser LR), incluso un insieme molto limitato di terminali. Una grammatica SPAN non sarebbe diversa; ogni "stato di analisi" di un parser implica un insieme limitato di terminali che vengono dopo, e uno organizza un parser per trarne vantaggio. (Ho creato parser L (AL) R e uno potrebbe facilmente utilizzare lo stato "corrente" per determinare il sottoinsieme di terminali che potrebbe accadere successivamente). Quindi, un parser di SPAN potrebbe determinare solo il piccolo insieme di token che potrebbero verificarsi in seguito in ogni stato, e usarlo per scegliere i characaters che comprendono quei token successivi (devono formare set disgiunti!).

Un modo semplice per implementare questo è con un recursive descent parser.

Così ho sostengono che tutto ciò che macchinari analisi sarebbe bene per l'analisi SPAN, con un po 'di lavoro personalizzato, eventualmente, a raccogliere i gettoni.

Le azioni di analisi per parser convenzionali creano alberi, ma è altrettanto semplice compilare i campi di una struttura di dati.

1

Investigare lo Gardens Point Parser Generator, un'app che genera un parser C# per qualsiasi lingua fornita una definizione di linguaggio simile a YACC.

2

Decente ricorsivo è un approccio piuttosto semplice per cose come questa.

Si avvia con un wrapper per il flusso sottostante che consente di leggere un carattere (o eventualmente una scheda/record nel tuo caso).

Quindi si scrive una serie di funzioni che fanno cose come 'leggere un numero, analizzarlo' e 'leggere un carattere e controllare che sia X'.

Queste funzioni riescono e avanzano lo stream o falliscono con un'eccezione di analisi.

Infine, è utile creare un insieme di combinatori che prendano le funzioni sopra elencate e le combinino, ad esempio 'leggi A, poi leggi B' o 'leggi A, e se fallisce, prova invece B'.

Problemi correlati