Stratego/XT: понимание основ

Я действительно пытался обдумать первые шаги в понимании 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 ответ

Решение
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*) (часть соответствия) соответствует текущему термину, текущий термин заменяется на правую часть Let([d1], Let([d2 | d*], e*))(частьсборки). Когда левая часть не совпадает, правило не выполняется и текущий термин остается неизменным.

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

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

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

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

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

Другие вопросы по тегам