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, я постараюсь ответить на них: -)