Stratego / XT: понимание основ - PullRequest
3 голосов
/ 24 апреля 2011

Я действительно пытался обдумать первые шаги в понимании Stratego / XT. Я много гуглил, и все веб-ресурсы, которые я обнаружил, вначале делают достаточно большой скачок, так что я просто не могу установить соединение. Позвольте мне объяснить.

Я понимаю абстрактные синтаксические деревья следующим образом:

Minus(Call(Var("f"),[Plus(Var("a"),Int("10"))]),Int("3"))

Но тогда кажется (даже в самом следующем предложении) документы делают этот скачок к этому:

LetSplit :
  Let([d1, d2 | d*], e*) ->
  Let([d1], Let([d2 | d*], e*))

Это не имеет смысла для меня. Может ли кто-нибудь объяснить, что здесь происходит с LetSplit?

Кроме того, есть ли хороший ресурс для углубленного понимания Stratego / XT, который легче прочитать, чем "гарганутан" и сложное официальное "руководство" на веб-сайте Stratego / XT?

Спасибо!

1 Ответ

3 голосов
/ 26 июля 2011
LetSplit :
  Let([d1, d2 | d*], e*) ->
  Let([d1], Let([d2 | d*], e*))

Это правило перезаписи с именем LetSplit.

Это эквивалентно ( синтаксический сахар ) стратегии :

LetSplit =
  ?Let([d1, d2 | d*], e*) ;        // match
  !Let([d1], Let([d2 | d*], e*))   // build

При вызове, тогда, когда левая сторона Let([d1, d2 | d*], e*) (часть match ) совпадает с текущим термином , текущий термин заменяется правой частью Let([d1], Let([d2 | d*], e*)) (часть build ). Если левая часть не совпадает, правило не выполняется, и текущий термин остается неизменным.

d1, d2, d *, e * являются переменными термина, привязанными к подсловам, найденным в соответствующих позициях во время матча. Затем имена используются в части сборки, где они расширяются до поддерева, к которому они были привязаны ранее. Обратите внимание, что действительно, * и 'могут появляться в конце имен переменных терминов. Одиночная кавычка не имеет особого значения, в то время как * имеет особое значение в операциях построения списка (здесь это не так).

Синтаксис [d1, d2 | d*] в части соответствия соответствует любому списку, содержащему как минимум два элемента. Эти элементы будут связаны с d1 и d2, а остальные элементы в списке будут связаны с d * (поэтому d * будет списком и может быть пустым списком []).

Кроме того, есть ли хороший ресурс для углубления понимания Stratego / XT, который легче читать, что garganutan и сложный официальный "учебник" на сайте Stratego / XT?

Научные работы. Хотя, по общему признанию, их на самом деле легче не читать, но, возможно, это единственное место, где объясняются некоторые из более продвинутых концепций.

В любом случае, не стесняйтесь задавать дополнительные вопросы здесь по stackoverflow, я постараюсь ответить на них: -)

...