Положим VAR p: POINTER TO RECORD f: INTEGER END, p^.f = 1 и рассмотрим
Код:
p^ := p^
В правой части - выражение, значение которого - запись с полем f Равным 1.
В левой части - составное имя (designator), которое обозначает переменную, на которую указывает p. У левой части, строго говоря, нет значения, потому что она левая, а в левой части присваивания - не выражение, а составное имя. У составного имени нет "текущего значения" (current value в СЯ); текущее значение есть только у переменных. Но составное имя обозначает переменную, а у нее есть значение.
Но в правой части присваивания находится выражение; составное имя является частным случаем выражения; поэтому в правой части у p^ есть значение.
Вот тебе и контекстно-свободная грамматика
Для ясности: я полагаю, что добавив слово variables, как показано ниже, можно внести бОльшую ясность в СЯ и подразумевать под переменными собсно переменные, элементы массивов и поля записей - но уже не на основе "обычаев", а на строгой формальной основе.
Цитата:
6.2
An array is a structure consisting of a number of elements which are all variables of the same type, called the element type.
6.3
A record type is a structure consisting of a fixed number of elements (variables), called fields, with possibly different types.