Strategie di lingua dichiarativa di input [chiusa]

1

Ho bisogno di sviluppare un semplice linguaggio dichiarativo per guidare un'applicazione. Ho vari moduli computazionali, alcuni dei quali dipendono da altri moduli che richiedono anche l'installazione. Il problema è che non so come manipolare le parole chiave. Mi spiegherò con un esempio

Task optimize
Units meters
System {
   // input data
}

Optimizer {
     type Simplex
     convergenceCriteria 0.001
}

PointEvaluator {
     type MyEvaluatorTechnique
     convergenceCriteria = 0.1
}

questa è una soluzione, che ha intestazione entità molto generiche che descrivono il significato di ciascuna sezione, ma potrei anche avere sezioni che riguardano in modo esplicito tecniche specifiche

Task {
     type optimize
     optimizer Simplex
}
Units meters
System {
   // input data
}

Simplex {
     convergenceCriteria 0.001
     PointEvaluator MyEvaluatorTechnique
}

MyEvaluatorTechnique {
     convergenceCriteria = 0.1
}

Mi piacerebbe sentire la tua opinione su quale metodo può suonare meglio in termini di correttezza del design, e pro e contro di entrambe le soluzioni. Una cosa che non mi piace nella prima soluzione è, ad esempio, il fatto che, a seconda del tipo, potrei avere opzioni che non hanno senso per quel tipo specifico. Nella seconda soluzione, tuttavia, non sto configurando l'attività generica (che quindi utilizza tipi specifici di sottosistema). Invece, specifica i sottosistemi specifici che eseguono l'attività.

    
posta Stefano Borini 16.02.2011 - 17:45
fonte

1 risposta

4

La progettazione di DSL è difficile.

Così difficile da suggerire di evitarlo fino a quando non sei costretto a creare il DSL.

Il mio suggerimento è questo.

  1. Crea una corretta gerarchia di classi.

  2. Crea iniziatori e costanti piacevoli e facili da usare.

  3. Fai in modo che le cose funzionino come semplice costruzione di oggetti.

Più tardi, dopo che le cose funzionano, e dopo aver visto cosa deve esprimere il DSL, considera la progettazione di un DSL.

Alcune definizioni di classe.

class  Task( object ):
    pass

class Optimizer( Task ):
    def __init__( self, optimizer ):
        pass

class Simplex( object ):
    def __init__( self, evaluator ):

class Evaluator( object ):
    def __init__( self, convergence ):
         pass

class MyEvaluatorTechnique( Evaluator ):
    pass

Una configurazione

config = Optimizer( 
    Simplex(), 
    MyEvaluatorTechnique( convergence=0.001 ) 
)

Questo evita molta complessità nella scrittura di un parser e nella gestione delle parole chiave. Invece, si usa il parser per un'altra lingua (cioè Python o Java o Lua o qualcosa del genere)

    
risposta data 16.02.2011 - 17:56
fonte

Leggi altre domande sui tag