Devo lasciare che i miei utenti scrivano BnfExpressions per estendere la grammatica?

7

Prefazione

Sto progettando un linguaggio di template (per favore salta il discorso no / why ??). Uno degli obiettivi principali di questa lingua è di essere estensibile. Ci sono 2 elementi principali nella mia lingua. "Tag" e "Direttive". I tag, per la maggior parte, mappano da 1 a 1 tag HTML, ad eccezione di alcuni di essi che fanno un po 'di più. Le "direttive" sono cose come condizionali e cicli / while.

I "tag" sono semplici, perché seguono tutti la stessa struttura: tag_name(arg1=val1, arg2=val2) { content } .

Le direttive sono più complicate perché hanno questo aspetto: directive(anything-can-go-here) { content } .

Domanda

Sto cercando di decidere come consentire agli utenti (altri sviluppatori che usano il linguaggio dei template) di scrivere la propria direttiva - cioè, definire la parte "tutto può andare qui".

Sto usando Irony per analizzare la mia lingua. Devo dare loro lo stesso livello di accesso e definire il proprio BnfExpression (richiedendo loro di imparare un po 'di Irony / EBNF ), o dovrei semplicemente lanciargli una stringa (il materiale tra ( e ) ) e lasciarli analizzare come vogliono?

I miei dubbi

Il primo è forse più potente e più facile da usare (una volta che lo conosci), ma potrebbe anche dare loro troppa potenza (non dovrebbero fermarsi al prossimo ) - beh, a meno che Ho prima rimosso la stringa interna e poi in pratica ho lasciato che definissero una sub-grammatica per analizzare solo quella).

Non sei sicuro di come avvicinarti a questo.

Ulteriori informazioni sui tag

Per riferimento, gli utenti possono definire "tag" come questo:

class ANode : HtmlNode
{
    public ANode(AttrDict attrs, params TagNode[] children)
        : base("a", attrs, children) { }
}

Sarebbe l'esempio più semplice, che estende semplicemente l'HtmlNode che ho già definito. Uno più complesso potrebbe definire alcuni attributi predefiniti o fare qualcosa di elaborato con gli elementi figli, o generare più tag html.

    
posta mpen 23.04.2011 - 23:47
fonte

1 risposta

2

Ci sono molti fattori che dovrebbero andare in questa decisione. Ecco alcuni aspetti da considerare:

Requisiti : ci sono casi d'uso che richiedono questa funzionalità o sarebbero sostanzialmente più facili da consegnare se fornisci questa funzionalità?

Pianifica : l'aggiunta di questa funzione può ritardare il completamento del tuo progetto. Quanti soldi perdi (o la tua azienda) se il lancio del prodotto viene ritardato?

Difficoltà costi / benefici : ti costerà qualcosa per fornire questa funzionalità. Devi scrivere codice, devi scrivere casi di test, i tuoi tester devono eseguire questi test, devi scrivere la documentazione per l'utente finale. Una volta implementato il prodotto, questa funzionalità dovrà essere supportata. Puoi stimare questi costi e bilanciarli con i benefici che otterrai dalla fornitura di questa capacità. Sarai in grado di vendere il tuo prodotto ad un prezzo più alto o ne potrai vendere di più?

    
risposta data 14.05.2011 - 00:59
fonte

Leggi altre domande sui tag