Bağlam için, önce this question about Ternary Operators'u okuyun.Üçlü Operatör Algoritması ile Ayrışan Üçlü Operatör
Özel işleçleri tanımlamanıza olanak tanıyan kendi programlama dilimi yapıyorum. Bunun mümkün olduğunca az derleyici olarak inşa eklentileri istiyorum olduğundan,
infix operator ? : { precedence 120 }
Benim (elle yazılmış) İfade Ayrıştırıcı içine yuvalanmış üçlü operatörler dönecek tercihen formda, özel üçlü operatörlerin tanımını izin vermelidir operatörler tarafından ayrılan işlenenlerin listesi.
a ? b ? c : d : e
(a) ? (b) ? (c) : (d) : (d)
OperatorChain(operators: [?, ?, :, :], operands: [a, b, c, d, e])
OperatorChain
sınıf artık kapsamında operatör tanımları operatörleri yukarı bakar ve aşağıda gösterilmiştir şant yarda algoritması, değiştirilmiş bir versiyonunu kullanarak ikili AST düğümler dönüştüren:
// Note: OperatorElement is a class that merely stores an Identifier, an associated source code position and the resolved operator.
// IValue is the base interface for all Expression AST nodes
final Stack<OperatorElement> operatorStack = new LinkedList<>();
final Stack<IValue> operandStack = new LinkedList<>();
operandStack.push(this.operands[0]);
for (int i = 0; i < this.operatorCount; i++)
{
final OperatorElement element1 = this.operators[i];
OperatorElement element2;
while (!operatorStack.isEmpty())
{
element2 = operatorStack.peek();
final int comparePrecedence = element1.operator.comparePrecedence(element2.operator);
if (comparePrecedence < 0
|| element1.operator.getAssociativity() != IOperator.RIGHT && comparePrecedence == 0)
{
operatorStack.pop();
this.pushCall(operandStack, element2);
}
else
{
break;
}
}
operatorStack.push(element1);
operandStack.push(this.operands[i + 1]);
}
while (!operatorStack.isEmpty())
{
this.pushCall(operandStack, operatorStack.pop());
}
return operandStack.pop().resolve(markers, context);
Özel algoritmalar da dahil olmak üzere üçlü operatörlerle çalışmak için bu algoritmayı nasıl değiştirmem gerekir?
Çok teşekkürler! Özel üçlü operatörlerini desteklemek için 'OperatorChain' sınıfımı uyarlamayı başardım. Tek fark, '' 'önce '' davranmadan davranmasıdır?“Doğru-ilişkilendirici olarak, bu amaçlanmış olsa da. – Clashsoft