【发布时间】:2021-05-11 07:53:18
【问题描述】:
我有一个用 C# 实现的语法。我的问题与评估表达式有关。仅与表达式有关的语法的简化版本是。请注意,语法还支持逻辑运算(使用 AND 和 OR,而不是 && 和 ||):
Expression => [ NegOp ] <Term> { <AddOp> <Term> }
Term => <Power> { <MulOp> <Power> }
Power => <Factor> [ ^ <Factor> ]
Factor => <Numeric> | ( OPENPAREN <Expression> CLOSEPAREN )
Numeric => <Float> | <Integer>
NegOp => + | - | NOT
AddOp => + | - | OR
MulOp => * | / | % | AND
我已经实现了表达式的从左到右求值,例如:
5 / 6 / 7
被解释为:
(5 / 6) / 7
但是,我不清楚如何将 NegOp 应用于表达式。如果我有表达式:
5 - 4 * 3 => -7
我在它前面加上一个减号,因此:
-5 - 4 * 3
这应该被解释为:
-(5 - 4 * 3) => 7
或:
(-5) - 4 * 3 => -17
即NegOp 应该与表达式中的第一个 Term 紧密绑定,还是在评估后应用于整个表达式?
【问题讨论】:
-
"NegOp 应该紧密绑定到表达式中的第一个 Term,还是在评估后应用于整个表达式?"那么,你想要哪种行为?
-
嗨@Sweeper,我想要被普遍接受为计算机语言规范的行为。我不知道是否有规范,或者这因语言而异。我希望以正确的方式从“知道的人”那里获得启迪。
-
根据您的语法,
-5 - 4 * 3会将一元减号应用于整个表达式,5 * -4在不添加括号的情况下根本不合法。但这绝对不是常态。 -
啊,我明白你的意思了。您是否会将 NegOp 转移到 Factor 语句中,例如:
Factor => ( [ <NegOp> ] <Numeric> ) | ( [ <NegOp> ] OPENPAREN <Expression> CLOSEPAREN ),然后将其从 Expression 语句中删除? -
数学上正确的形式是最直观的。如果你将该术语分配给像
int i=-5-4*3;这样的变量,你会在 c#、java 和 c++ 中得到 -17 for i ...
标签: c# expression grammar ambiguous-grammar