Как написать внутренний, естественный язык, DSL, используя Ruby + Regex? - PullRequest
2 голосов
/ 10 декабря 2010

Я ищу простой пример того, как написать внутренний DSL, используя Ruby и регулярное выражение. Подобно тому, как Синатра обрабатывает маршруты

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

Также похоже на то, как Cucumber обрабатывает определения шагов:

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

Я не заинтересован в строителях или беглых цепях методов. В основном я хочу класс Ruby, который выглядит примерно так:

class SpecVocabulary

   match ‘pattern’ do
      # Some Ruby code here
   end

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

Я борюсь с тем, чтобы связать код, который заставляет класс SpecVocabular автоматически сопоставлять шаблоны и заполнять его данные.

Я надеюсь, что у кого-то есть простой пример того, как это сделать, я стараюсь не погружаться в источник Синатры и Огурека.

Кстати, у меня уже есть определение естественного языка, хотя я намеренно его опустил.

1 Ответ

1 голос
/ 10 декабря 2010

Вот подробное сообщение в блоге о создании DSL в Ruby:

http://www.daniel -azuma.com / блог / просмотр / z3bqa0t01uugg1 / implementing_dsl_blocks

Кстати, использование DSL в классе не распространено, я думаю, что это будет выглядеть примерно так:

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
...