Вы, вероятно, сможете достичь этого, используя грамматику многократного переписывания дерева проходов.Правила должны быть довольно короткими.
примерно так же, как это для случая ИЛИ:
orCaseRight: a=. NEAR ^(OR x=. y=.) -> ^(OR ^(NEAR $a $x) ^(NEAR $a $y));
orCaseLeft: ^(OR x=. y=.) NEAR a=. -> ^(OR ^(NEAR $a $x) ^(NEAR $a $y));
в topDown добавить действие, которое устанавливает флаг rewrite
, когда правило соответствует, такВы можете применять эту грамматику до тех пор, пока установлен флаг rewrite
.
Я использую это для оптимизации / предварительного вычисления математических выражений, и это работает как шарм.