我已经实现了shunting-yard algorithm来解析从中缀到后缀表示法的算术字符串表达式。
我现在还想用relational operators和Ternary conditional解析表达式。考虑C++ Operator Precedence我添加了优先级最低的运算符,right-associativity
和?
的{{1}}以及:
的第二低和left-associativity
和>
。
当我现在解析一个表达式:<
(其中A,B,C和D可以是任何有效的算术表达式)我希望:A>B?C:D
,但我得到A B > C D : ?
。当我使用圆括号来首先评估条件A B C D : ? <
时它是有效的。像(A>B)?C:D
这样的混合表达式给了我(1+2<3+4)?C:D
这似乎对我来说也是合法的。 1 2 + 3 4 + < C D : ?
给了我(A<B)?5+6:C
,这又搞砸了。同样,A B < 5 6 : + ?
会解决这个问题。
如评论中所述,首先评估条件并继续使用左算术表达式也可以。但我真的没有偶然发现在我的研究中使用关系和三元运算符来评估表达式的算法。任何帮助,即使指出算法也会非常感激
这是分流场的实施:
(A<B)?(5+6):C
编辑:使代码和描述更加简洁以实现可读性
另一个编辑:治疗?:左关联给了我预期的输出
现在,关于三元条件相关性的this问题。如果我输入QQueue<QString> ShuntingYard::infixToPostfixWithConditionals(const QString& expression)
{
QStack<QString> stack;
QQueue<QString> queue;
QString token;
QStringList tokens = splitExpression(expression);
Q_FOREACH(QString token, tokens)
{
if (isDefineOrNumber(token))
queue.enqueue(token);
if (isFunction(token))
stack.push(token);
if (isOperator(token))
{
while (!stack.isEmpty() && isOperator(stack.top()) && isLeftAssociativeOperator(token) && !hasHigherPrecedence(token, stack.top()))
queue.enqueue(stack.pop());
stack.push(token);
}
if (isLeftParenthese(token))
stack.push(token);
else if (isRightParenthese(token))
{
while (!isLeftParenthese(stack.top()))
{
if (stack.isEmpty())
break;
if (isOperator(stack.top()))
queue.enqueue(stack.pop());
}
stack.pop();
if (isFunction(stack.top()))
queue.enqueue(stack.pop());
}
}
while (!stack.isEmpty())
{
if (isLeftParenthese(stack.top()))
break;
queue.enqueue(stack.pop());
}
return queue;
}
我得到a<b?a:b?c:d
,其中a b < a b c d : ? : ?
将首先评估,这是正确的,因为它具有更高的优先级,但之后会a < b
首先评估,是从右到左的正确顺序。混乱。