Действительно ли скобки необходимы в выражениях с унарными логическими операторами?
VHDL-2008 представил операторы сокращения, которые принимают массив логических элементов 1D и выдают одноразрядное значение. Цитата из Verification Horizons Vol. 8 выпуск 3 октября 2012 года:
VHDL-2008 создает унарные версии AND, OR, NOR, NAND, XOR и XNOR для типов логических массивов (bit_vector, std_logic_vector, …). Операторы применяются к каждому элементу аргумента массива (операция сокращения) и выдают результат элемента. Унарные операторы имеют тот же приоритет, что и разные операторы (**, ABS и NOT).
Механика объясняется в LRM [9.2.2], но что мотивирует этот вопрос, это примечание 2 из [9.1]:
ПРИМЕЧАНИЕ 2. - Синтаксис для выражения, включающего унарный оператор условия или унарный логический оператор в сочетании с любым другим оператором, требует, чтобы унарный оператор и его операнд были выражением в скобках. Например, выражения "(и A) и B" и "A и (и B)" являются законными, тогда как выражения "и A и B" и "A и 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] даст некоторые подсказки, почему это работает:
ПРИМЕЧАНИЕ. - Все двоичные логические операторы принадлежат к классу операторов с наименьшим приоритетом. Унарные логические операторы относятся к классу операторов с наивысшим приоритетом
Согласно этому примечанию, инструмент не должен иметь проблем с пониманием выражений в приведенных выше примерах.
Итак, вопрос заключается в следующем: нужно ли нам писать круглые скобки, как указано в примечании 2 в [9.1], или мы можем полагаться на приоритет операторов, как предполагает примечание в [9.2.2]?
1 ответ
См. Приоритет унарных логических операторов от 2013-11-14.
действия
Измените производство грамматики для разных операторов (обратите внимание, что лишних пробелов после унарного не должно быть - это проблема твики)
разное_оператор::= ** | пресс | не | унарный _logical_operator
Удалить примечание 2 вверху 118, которое гласит:
"ПРИМЕЧАНИЕ 2. - Синтаксис для выражения, включающего унарный оператор условия или унарный логический оператор в сочетании с любым другим оператором, требует, чтобы унарный оператор и его операнд были выражением в скобках. Например, выражения" (и A) и B " и "А и (и В)" являются законными, тогда как выражения "и А и В" и "А и В" не являются. Аналогично, "и (и А)" являются законными, тогда как "и и А" нет. Выражение, состоящее только из унарного оператора или унарного логического оператора и его операнда, не нужно заключать в скобки ".
После прохождения вопроса de novo я его поддержу. Причина, по которой это устраняет лексическую неоднозначность, требует, чтобы первоначальное соответствие ПРИМЕЧАНИЕ 2 было обнаружено во время разработки, а не отражено в EBNF. (Если бы требовались круглые скобки, они должны появляться в EBNF, подобно тем, которые смешивают двоичные логические операторы с одинаковым приоритетом).
Пока неизвестно, когда и если это будет одобрено.