procedure p1;
var i,j: integer;
procedure p2 (k: integer);
var i: integer;
begin {procedure p2} … i := 2; j := 2; k := 3; … end; {procedure p2}
begin {procedure p1} … i := 1; j := 1; p2 (i); … end; {procedure p1}
В процедуре p2 доступны внутренняя переменная i, которая закрывает доступ к одноименной внешней переменной процедуры p1, внешняя перемен¬ная j и параметр k. Значение переменной i передается процедуре p2 через параметр, а j – через непосредственный доступ к внешней переменной. После возврата из процедуры p2 в процедуру p1 переменная i сохранит старое значение 1, в то время как переменная j после присваивания j:=2 в процедуре p2 будет иметь значение 2. Заметим, что если бы формальный параметр k был определен в заголовке процедуры p2 как выходной (с ключевым словом var), то после вызова p2(i) значение переменной i оказалось бы равным 3.
Оба способа передачи значений имеют свои достоинства и недостатки. При передаче значений посредством параметров производится фактическое копирование значений во внутренние переменные процедуры. При больших объемах передаваемых данных это приводит к потерям времени и памяти. Широкое использование внешних переменных усложняет текст и затрудняет его чтение. Истина лежит где-то посередине.
4.12. БНФ – метаязык описания синтаксиса языков программирования.
По мере создания все новых и новых языков программирования в связи с проблемой программирования трансляторов появилась острая необходи¬мость в формализации описания синтаксиса языка. Язык, используемый для формализации синтаксиса другого языка, называется метаязыком. В насто¬ящее время наиболее употребительным для описания синтаксиса языков программирования является метаязык форм Бэкуса Наура (сокращенно БНФ). Идея этого метаязыка заключается в структурировании понятий исходного языка программирования и определения более сложных понятий через более простые. Для этого в языке БНФ приняты следующие соглашения.
Любое понятие Паскаля изображается своим наименованием, заключенным в угловые скобки: <...> . Предложение БНФ представляет собой одно определение некоторого понятия Паскаля через другие в форме: понятие Паскаля, после которого следует знак “::=“, после которого записывается определение понятия. В составе определения могут использоваться другие понятия языка программирования (в нашем случае Паскаля), символы алфавита (терминальные символы) и ключевые слова языка программирования, а также специальные символы языка БНФ, которые имеют определенный смысл. В качестве таких символов используются вертикальная черта и круглые, квадратные и фигурные скобки. Их использование подчиняется следующим правилам:
• запись ::= и т.д. означает, что первое понятие в Паскале представляет собой последовательную запись остальных понятий;
• запись ::= | | и т.д. означает, что первое понятие совпадает с одним из остальных понятий;
• круглые скобки используются для группировки сложных конструкций БНФ внутри простых;
• часть определения, заключенная в квадратные скобки, не обязательна;
• часть определения, заключенная в фигурные скобки, может быть повторена произвольное число раз (в том числе ни одного раза);
• вместо сложного понятия Паскаля в формы БНФ могут входить терминальные символы и ключевые слова; для того, чтобы отличать их от символов БНФ (например, скобок) условимся, что мы будем выделять символы Паскаля и ключевые слова жирным курсивом .
Приведем несколько примеров. Непустой список, состоящий из произвольного числа элементов, разделенных запятой, описывается так:
8th Май 2011
|
Теги:
|