2010-12-10 45 views
2

Je cherche un exemple simple de la façon d'écrire un DSL interne en utilisant des motifs Ruby et regex. Semblable à la façon dont les itinéraires poignées SinatraComment écrire un langage interne, naturel, DSL en utilisant Ruby + Regex?

get '/say/*/to/*' do 
    # Some Ruby code here 
end 

également similaire au traitement par concombre Définitions étape:

Given /^I have (\d+) cucumbers in my belly$/ do |cukes| 
    # Some Ruby code here 
end 

Je ne suis pas intéressé par les constructeurs, ou de méthodes enchaînées couramment. Fondamentalement, je veux une classe Ruby qui ressemble à ceci:

class SpecVocabulary 

    match ‘pattern’ do 
     # Some Ruby code here 
    end 

    # Or, using a different keyword 
    phrase ‘pattern’ do 
     # Some Ruby code here 
    end 
end 

Ce que je suis aux prises avec le câblage est-le code qui rend la classe SpecVocabular correspondent automatiquement les modèles et remplir ses données. J'espère que quelqu'un a un exemple simple de comment faire ceci, j'essaye d'éviter d'avoir à plonger dans la source pour Sinatra et le concombre. Par ailleurs, j'ai déjà défini le langage naturel, bien que je l'aie omis volontairement.

Répondre

1

Voici un blog complet sur la création DSLs dans Ruby:

http://www.daniel-azuma.com/blog/view/z3bqa0t01uugg1/implementing_dsl_blocks

BTW, il est rare d'utiliser votre DSL dans une classe, je pense que ce serait plutôt ressembler à:

vocabulary :SpecVocabulary do 
    match 'pattern' do 
    # Some Ruby code here 
    end 

    # Or, using a different keyword 
    phrase 'pattern' do 
    # Some Ruby code here 
    end 
end