【问题标题】:Are parentheses really necessary in expressions with unary logical operators?一元逻辑运算符的表达式中真的需要括号吗?
【发布时间】:2014-10-07 08:57:16
【问题描述】:

VHDL-2008 引入了归约运算符,它接收一维逻辑元素数组并输出单个位值。引用自验证视野卷。 8 2012 年 10 月 3 日:

VHDL-2008 创建 AND、OR、NOR、NAND、XOR 和 XNOR 的一元版本 对于逻辑数组类型(bit_vector,std_logic_vector,...)。这 运算符应用于数组参数的每个元素(a 归约运算)并产生一个元素结果。一元运算符 与其他运算符(**、ABS 和 不是)。

机制在 LRM [9.2.2] 中进行了解释,但引发这个问题的是 [9.1] 中的注释 2:

注意 2 - 涉及一元条件的表达式的语法 运算符或一元逻辑运算符与任何其他运算符的组合 运算符 要求一元运算符及其操作数是 括号表达式。例如,表达式“(和 A)和 B”和“A and (and B)”是合法的,而“and A and B”的表述是合法的 而“A and B”不是。

不过,ModelSim 和 ActiveHDL 很乐意接受这一点:

variable B, Y: bit;
variable A: bit_vector(3 downto 0);
...
Y := and A and B;  -- Should be illegal according to Note 2 [9.1]

还有这个:

variable A, Y: bit;
variable B: bit_vector(3 downto 0);
...
Y := A and and B;  -- Should be illegal according to Note 2 [9.1]

现在,如果我们继续阅读 LRM,[9.2.2] 中的另一条注释提供了一些线索,说明它为什么有效:

注意——所有的二元逻辑运算符都属于 具有最低优先级的运算符。一元逻辑运算符 属于优先级最高的一类运算符

根据这个注释,该工具理解上述示例中的表达式应该没有问题。

所以,问题是:我们真的需要像 [9.1] 中的注释 2 所建议的那样写括号,还是我们可以依赖运算符优先级作为 [9.2.2] 中的注释建议?

【问题讨论】:

  • 您知道,您只是缺乏自己回答这些问题的参考资源,并且正在迅速掌握 VHDL 语言(或至少是标准)。 You might consider an association with VASG/P1076, where individuals can contribute, IEEE membership only required to hold an (elected) office.您有能力为标准流程做出贡献。
  • @DavidKoontz 感谢您的信任投票,我目前正在对一个学术项目的标准进行调查。完成后我会尽快调查 VASG。

标签: operators vhdl operator-precedence unary-operator


【解决方案1】:

请参阅 Precedence of Unary Logical Operators 日期为 2013 年 11 月 14 日。

动作

将杂项运算符的语法生成更改为(注意一元后的多余空格不应该存在 - 这是一个 twiki 问题)

miscellaneous_operator ::= ** |腹肌 |不是|一元 _logical_operator

删除 118 顶部的注释 2,内容如下:

“注 2——涉及一元条件运算符或一元逻辑运算符与任何其他运算符组合的表达式的语法要求一元运算符及其操作数是带括号的表达式。例如,表达式“(和 A) and B”和“A and (and B)”是合法的,而“and A and B”和“A and and B”是不合法的。同样,“and (and A)”是合法的,而“and and and A”不是。仅由一元条件运算符或一元逻辑运算符组成的表达式,其操作数不需要括号。”


在从头解决问题后,我会支持它。这样做的原因是消除了词汇上的歧义,需要在细化时捕获原始的注释 2 合规性,而不是反映在 EBNF 中。 (如果需要括号,它们应该出现在 EBNF 中,就像混合具有相同优先级的二元逻辑运算符一样)。

尚不清楚何时以及是否会获得批准。

【讨论】:

  • 谢谢,那么你认为这是朝哪个方向发展,带括号还是不带括号?
  • 我认为Actions会被采纳。
  • 注 2 是修订过程中的疏忽。最初,这些运算符的优先级较低,并且需要带有多个运算符表达式的括号,但是,这在过程的后期进行了更改,并且似乎没有更新注释以反映这一点。
  • NOTES 为信息性而非权威性,9.1 NOTE 2 在 IEEE 批准的 IEEE Std P1076-2019/D13 中被删除,原来的 NOTE 3 成为新的 NOTE 2。
猜你喜欢
  • 2015-03-25
  • 2015-02-22
  • 2012-10-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
相关资源
最近更新 更多