2010-03-10 1 views
9

Attualmente sto lavorando a un progetto che sta accedendo a un componente hardware utilizzando tonnellate di posizioni di memoria codificate. Queste posizioni possono cambiare in base al capriccio dell'ingegnere elettrico, quindi sto cercando di generare codice dalla mappa della memoria dell'ingegnere. Diciamo che la mappa è un file di testo semplice come:C'è un modo semplice per generare codice da un file di testo?

Name, Type, Address, Description 
Foo, int, A001, Foo integer variable 
Bar, float, A002, Bar float variable 

Vorrei generare automaticamente il codice (non IL) simile a:

class MachineMap 
{ 
    /// <summary> 
    /// Foo integer variable 
    /// </summary> 
    public readonly Addressable<int> Foo = new Addressable<int>("A001"); 
    /// <summary> 
    /// Bar float variable 
    /// </summary> 
    public readonly Addressable<float> Bar = new Addressable<float>("A002"); 
} 

Qualcuno ha idee su strumenti che renderebbero questo compito facile, o più facile?

+0

Non capisco, perché avete bisogno di più di StreamWriter? –

+0

L'esempio sopra è piuttosto ingenuo. Ho un certo numero di diversi tipi di classi indirizzabili e vorrei creare una gerarchia; .e.g MachineMap.Arm1.Sensor1.Value ecc. –

risposta

4

Dai un'occhiata alla capacità di generazione di codice integrata di Visual Studio chiamata T4. Oppure un'altra opzione potrebbe essere un prodotto commerciale come CodeSmith.

Date un'occhiata a questo articolo di Scott Hanselman:
T4 (Text Template Transformation Toolkit) Code Generation - Best Kept Visual Studio Secret

+0

Sapete se T4/CodeSmith consente di generare codice da un'altra fonte, ad esempio un foglio Excel? –

+0

Grazie per il link Hanselman. Stavo guardando T4, ma non ho capito che puoi essenzialmente scrivere qualsiasi codice C# come parte del modello. Questo tutorial si riferisce abbastanza bene a quello che sto cercando di fare: http://aabs.wordpress.com/2008/06/26/state-machines-in-c-30-using-t4-templates/ –

0

si potrebbe essere in grado di creare un DSL di tua scelta, e quindi utilizzare M Grammar (parte di Oslo) per analizzarlo.

0

Analogamente al suggerimento di Nick's Oslo, StringTemplate è un altro modo per creare codice sorgente basato su modello da una grammatica ben definita. Ha una porta C#, quindi è abbastanza facile da usare da. NET.

3

utilizzare un'espressione regolare come questo (usando gvim o vim):

:%s/\(.*\), \(.*\), \(.*\), \(.*\)/public readonly Addressable<\2> \1 = new Addressable<\2>("\3")/g 

Questo risolve il parsing parte principale. È quindi concatenare i contenuti con i file di intestazione e piè:

type header.txt converted.txt footer.txt > source.c 

Se la mappa è più complesso, quindi utilizzare uno strumento realizzato per la grammatica analisi. Altrimenti, se è davvero così semplice, evita di usare un serbatoio per un chiodo così piccolo.

+0

+1 Questo e qualche riflessione per creare dinamicamente gli oggetti indirizzabili <> e il gioco è fatto. – kenny