2012-06-19 3 views
1

Я работаю над прерывателем, позволяющим определять своих операторов. Цель состоит в том, чтобы взять 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.

+0

На самом деле правая ассоциативность делает многое более понятным. Попробуйте визуализировать дерево разбора 'a или b или c или d или e'. Когда лево-ассоциативный и 'a' истинны, мы поднимаемся вверх и вверх по дереву, чтобы получить истинную вершину. Когда право-ассоциативный, если 'a' истинно, ta-da, мы закончили! Намного легче игнорировать все остальное выражение. Почему вы говорите, что есть проблема с право-ассоциативностью? Оба они имеют одинаковое поведение ИМХО. –

ответ

1

Boolean implication бывает.

Я бы, наверное, читали

a → b → c 

как «означает, что Ъ следует с», который бы предположить, что он должен в скобки

a → (b → c) 

и логический вывод, вероятно, следует короткое замыкание, так как, когда false, тогда правая часть (a → b) не имеет отношения к результату.

+0

Интересно! В то время как он связывается вправо, он замыкает на ** левый **, то есть 'a' всегда будет оценен, но' b' сгруппирован с 'c' не' a'. Я все еще могу законно оценить «а», чтобы найти значение «→». –

+0

@ JohnF.Miller, другие правые ассоциативные операторы обычно оценивают слева направо на языках, где такие вещи четко определены. Назначение обычно является правильным ассоциативным, но в JavaScript lhs оценивается перед rhs: 'var x = 42; var y = []; (x = y) [0] = x; 'заканчивается в том же состоянии, что и программа' var y = []; x = y [0] = y; '. Я считаю, что Java делает то же самое; Python запрещает назначение в качестве подвыражения; и C, C++ и OCaml не задают порядок оценки. –

Смежные вопросы