2014-04-07 16 views
7

Sto cercando di implementare una funzione simile a DSL in C#. Potrebbe sembrare qualcosa di simile alle query LINQ. Mi chiedo se sia possibile implementare nuovi operatori unari o binari utilizzando Roslyn.Come aggiungere un nuovo operatore in C# usando Roslyn

Ho cercato su Google pochi giorni senza molto successo. Sarebbe bello se qualcuno potesse indicarmi alcuni campioni o documentazioni di Roslyn.

+1

Penso che avete bisogno di guardare [ Quali argomenti posso chiedere qui?] (Http://stackoverflow.com/help/on-topic) –

+4

La domanda sicuramente NON richiede una raccomandazione di strumenti di terze parti. Roslyn è una funzionalità chiave dell'ultima versione di C#. Si può dire che l'OP dovrebbe prima controllare la pagina di Roslyn. –

+1

Roslyn è un compilatore e sono [open source] (http://arstechnica.com/information-technology/2014/04/microsoft-open-sources-a-big-chunk-of-net/). Quindi tecnicamente potresti implementare tutte le funzionalità che desideri, purché tu abbia lo skillset necessario. – mason

risposta

9

Esistono due modi per utilizzare Roslyn per implementare un nuovo linguaggio basato su C#.

  1. utilizzare l'API di Roslyn per analizzare il codice sorgente in un albero di sintassi, quindi trasformare l'albero di sintassi nella effettiva C# e compilare questo.

    Questo è l'ideale se il tuo linguaggio è in realtà un codice C# sintatticamente valido, ma la semantica è diversa. Ad esempio, potresti implementare await in questo modo, se hai forzato await in modo che assomigli a una chiamata di funzione (ad esempio, await(x) sarebbe valido, ma non await x).

    Se si desidera introdurre una nuova sintassi (come un nuovo operatore), potrebbe funzionare, poiché Roslyn supporta l'analisi del codice "interrotto". Ma molto probabilmente non funzionerà così bene, perché quindi l'albero della sintassi potrebbe non apparire nel modo desiderato. Peggio ancora, i risultati potrebbero non essere coerenti (a volte la tua nuova sintassi verrà analizzata in un modo, a volte in un altro).

  2. Poiché Roslyn è ora open source, è possibile modificare il codice sorgente del compilatore in qualsiasi modo, incluso l'aggiunta di un nuovo operatore.

    Ma farlo probabilmente non sarà semplice. E penso che il flusso di lavoro è anche andare a essere più complicato: è necessario compilare la propria versione del compilatore, non solo utilizzare una libreria da NuGet come nell'opzione 1.

Problemi correlati