Domanda

Sto scrivendo una lingua usando ANTLR ed Expression alberi.

Ho definito un metodo standard di fabbrica per il mio albero di Parser da usare quando si generano, inoltre, e funziona molto bene per il costruito nel tipi integrali, ora sto passando a tipi più generali.

Al momento è incredibilmente ingenuo, lo fa semplicemente questo (in corso codice TDD sembra spesso ragione ingenuo!?):

protected Expression GenerateAdd(Expression left, Expression right)
{
  if (left.Type.Equals(right.Type))
    return Expression.Add(left, right);
  if (left.Type.IsValueType && right.Type.IsValueType)
    Promote7_2_6_2(ref left, ref right);
  return Expression.Add(left, right);
}

Dove Promote7_2_6_2 genera espressioni Converti che seguono le regole per la promozione integrale come stabilito dalla C # spec 7.2.6.2 (La lingua sarà simile a C #, ma sarà cross-over con JScript, oltre ad avere altre nuove parole chiave) .

Naturalmente, sono passato a testare Inoltre stringa - cioè "a" + "b"; ed ottengo l'errore:

System.InvalidOperationException: The binary operator Add is not defined for the types 'System.String' and 'System.String'.

Fiera abbastanza - rifletto System.String e abbastanza sicuro che l 'operatore è infatti non definito. Generazione di un albero di espressione in un metodo di prova in questo modo:

Expression<Func<string, string, string>> e = (s1, s2) => s1 + s2;

Spettacoli che un componente aggiuntivo BinaryExpression è infatti creato, ma con il metodo di implementazione insieme ad uno dei metodi string.Concat.

ero consapevole che stavo andando a guardare a fare qualcosa di simile, in alcuni casi, ma quanti altri tipi definisco Inoltre in questo modo? E 'solo string?

E 'una norma inserita all'interno del compilatore C # - o c'è una sorta di meta-dati rilevabili che posso usare per l'auto-scoprire tali metodi su altri tipi

?

Grazie in anticipo!

È stato utile?

Soluzione

Sembra che faccio una grande linea nel rispondere alle mie domande!

Le mie scuse, questa risposta potrebbe essere meglio formattato, ma io sono sul mio HTC desiderio e la sua tastiera non supporta tutti i simboli!

sembra che non v'è alcun modo per 'scoprire' queste regole in fase di runtime, è responsabilità di lingua del paese ospitante per decidere come implementare cose come aggiunta stringa. C # si adatta al numero di mandati consecutivi in ??un'aggiunta, chiamando il metodo .Concat che più appropriatamente questo.

Quindi, se voglio la mia lingua al supporto aggiunta di istanze di classi in cui un operatore non è definito per esso, per esempio, posso semplicemente scrivere o trovare un metodo statico per farlo (la firma corretta ovviamente!) E quindi cablare la lingua da usare in questo caso. Un classico esempio è se sostenere matrice1 + matrice2 attraverso metodi statici Array.

Come per la scoperta degli operatori, il metodo Expression.Add si occupa di questo, ma non esegue automaticamente conversioni, così come con l'integrale / floating point metodo di promozione Ho riferimento nell'interrogazione, nuovamente spetta alle regole del linguaggio per determinare se sono necessari altri conversioni prima di tentare di costruire l'espressione.

Come tale, è probabilmente meglio per riflettere il primo operatore, per vedere se definito per i due tipi, prima di allora considerare una conversione se esistente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top