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.