Я работаю над прерывателем, позволяющим определять своих операторов. Цель состоит в том, чтобы взять AST, который выглядит как exp op exp op exp
и превратить его в exp op (exp op exp)
или (exp op exp) op exp
на основе относительного приоритета и ассоциативности двух операторов. Язык является динамическим, поэтому единственный способ узнать, какую версию оператора использовать - это оценить первое выражение и спросить его, какую версию op
использовать.Есть ли подходящие ассоциативные операторы короткого замыкания
С другой стороны, важно, что мы не оценивать второе выражение, потому что если op
является ||
(как обычно используется), то мы должны быть в состоянии короткого замыкания, если первый exp
является false
.
проблема возникла бы, если бы какой-либо оператор был как право ассоциативным, так и короткозамкнутым. Мой вопрос в том, есть ли подходящие ассоциативные, короткозамкнутые операторы общего пользования (для выбранного значения «common»)?
N.b. назначение обрабатывается отдельно парсером, поэтому =
не является оператором, а a (op)= b
является синтаксическим сахаром для a = a op b
.
На самом деле правая ассоциативность делает многое более понятным. Попробуйте визуализировать дерево разбора 'a или b или c или d или e'. Когда лево-ассоциативный и 'a' истинны, мы поднимаемся вверх и вверх по дереву, чтобы получить истинную вершину. Когда право-ассоциативный, если 'a' истинно, ta-da, мы закончили! Намного легче игнорировать все остальное выражение. Почему вы говорите, что есть проблема с право-ассоциативностью? Оба они имеют одинаковое поведение ИМХО. –