<<
>>

Объявления

БНФ для объявлений в Pascal такая:

::= ( |

|

|

|

|

)*

(Заметьте, что я использую более либеральное определение, используемое в Turbo Pascal. В определении стандартного Pascal каждая из этих частей должна следовать в определенном порядке относительно других).

Как обычно давайте позволим одиночным символам представлять каждый из этих типов объявлений. Новая форма для Declarations:

{–}

{ Parse and Translate the Declaration Part }

procedure Declarations;

begin

while Look in ['l', 'c', 't', 'v', 'p', 'f'] do

case Look of

'l': Labels;

'c': Constants;

't': Types;

'v': Variables;

'p': DoProcedure;

'f': DoFunction;

end;

end;

{–}

Конечно, нам нужны процедуры-заглушки для каждого из этих типов объявлений. На этот раз они не могут быть совсем пустыми процедурами, так как иначе мы останемся с бесконечным циклом While. По крайней мере каждая подпрограмма распознавания должна съедать символ, который вызывает ее. Вставьте следующие процедуры:

{–}

{ Process Label Statement }

procedure Labels;

begin

Match('l');

end;

{–}

{ Process Const Statement }

procedure Constants;

begin

Match('c');

end;

{–}

{ Process Type Statement }

procedure Types;

begin

Match('t');

end;

{–}

{ Process Var Statement }

procedure Variables;

begin

Match('v');

end;

{–}

{ Process Procedure Definition }

procedure DoProcedure;

begin

Match('p');

end;

{–}

{ Process Function Definition }

procedure DoFunction;

begin

Match('f');

end;

{–}

Теперь испытайте компилятор используя несколько характерных входных последовательностей.

Вы можете смешивать объявления любым образом, каким вам нравится пока последним символом в программе не будет ".", указывающий на конец программы.
Конечно, ни одно из этих объявлений фактически ничего не объявляет, так что вам не нужны (и вы не можете использовать) любые символы, кроме тех, которые обозначают ключевые слова.

Мы можем расширить раздел операторов аналогичным способом. БНФ для него будет:

::=

::= BEGIN (';' ) END

Заметьте, что утверждение может начинаться с любого идентификатора, исключая END. Так что первая пустой формой процедуры Statements будет:

{–}

{ Parse and Translate the Statement Part }

procedure Statements;

begin

Match('b');

while Look 'e' do

GetChar;

Match('e');

end;

{–}

Сейчас компилятор примет любое число объявлений, сопровождаемое блоком BEGIN основной программы. Сам этот блок может содержать любые символы (за исключением END), но они должны присутствовать.

Простейшая входная форма сейчас

'pxbe.'

Испытайте ее. Также попробуйте некоторые ее комбинации. Сделайте некоторые преднамеренные ошибки и посмотрите что произойдет.

К этому моменту вы должны начать видеть основную линию. Мы начинаем с пустого транслятора для обработки программы, затем в свою очередь мы расширяем каждую процедуру, основанную на ее БНФ определении. Подобно тому, как более низкоуровневые БНФ определения добавляют детали и развивают определения более высокого уровня, более низкоуровневые распознаватели будут анализировать более детально входную программу. Когда последняя заглушка будет расширена, компилятор будет закончен. Это нисходящая разработка/реализация в ее чистейшей форме.

Вы могли бы заметить, что даже хотя мы и добавляли процедуры, выходной результат программы не изменялся. Так и должно быть. На этих верхних уровнях не требуется никакой выдачи кода. Распознаватели функционируют просто как распознаватели. Они принимают входные последовательности, отлавливают плохие и направляют хорошие в нужные места, так что они делают свою работу. Если бы мы занимались этим немного дольше, код начал бы появляться.

Следующим шагом в нашем расширении должна возможно быть процедура Statements.

Определение Pascal:

::= |

::= | | null

::= |

|

|

|

|

|

Это начинает выглядеть знакомыми. Фактически вы уже прошли через процесс синтаксического анализа и генерации кода и для операций присваивания и для управляющих структур. Это место, где верхний уровень встречается с нашим восходящим методом из предыдущих уроков. Конструкции будут немного отличаться от тех, которые мы использовали для KISS, но в этих различиях нет ничего, чего бы вы не смогли сделать.

Я думаю теперь вы можете получить представление об этом процессе. Мы начали с завершенного БНФ описания языка. Начиная с верхнего уровня мы закодировали распознаватели для этих БНФ утверждений используя процедуры-заглушки для распознавателей следующего уровня. Затем мы расширили более низкоуровневые утверждения один за другим.

Как оказывается, определение Pascal очень совместимо с использованием БНФ и БНФ описания этого языка существуют в избытке. Вооружившись таким описанием вы обнаружите, что довольно просто продолжить процесс, который мы начали.

Вы могли бы продолжить расширение этих конструкций, просто чтобы прочувствовать это. Я не ожидаю, что вы сможет завершить сейчас компилятор Паскаля... есть слишком много вещей таких как процедуры и типы, к которым мы еще не обращались... но могло бы быть полезным попробовать некоторые из более знакомых вещей. Вам было бы полезно увидеть выполнимые программы, появляющиеся с другого конца.

Если бы я собирался обратиться к вопросам которые мы еще не охватили, я предпочел бы сделать это в контексте KISS. Мы не пытаемся построить полный копилятор Pascal, поэтому я собираюсь остановить на этом расширение Pascal. Давайте взглянем на очень отличающийся язык.

<< | >>
Источник: Креншоу Джек. Давайте создадим компилятор!. 1999

Еще по теме Объявления:

  1. 3. Объявление гражданина умершим
  2. 9. Безвестное отсутствие. Объявление гражданина умершим
  3. Статья 1250. Объявление нотариусом секретного завещания
  4. Статья 1150. Право на объявление конкурса
  5. Статья 47. Правовые последствия объявления физического лица умершим
  6. Параграф 1. Публичное обещание вознаграждения без объявления конкурса
  7. 4. Последствия явки гражданина, объявленного умершим
  8. § 5. Признание гражданина безвестное отсутствующим и объявление умершим
  9. Объявление о «Полярной звезде»
  10. Статья 46. Объявление физического лица умершим
  11. § 7. Правоотношения из объявления публичного конкурса (п. 2543-2552)
  12. § 5. Признание гражданина безвестно отсутствующим и объявление умершим
  13. 5.1.3. Рекламное объявление в газете: содержание и форма
  14. 9. Признание физического лица безвестно отсутствующим и объявление его умершим
  15. Статья 1144. Право на публичное обещание вознаграждения без объявления конкурса
  16. § 36 С какой минуты совершается приобретение вотчинного права. – Римская традиция. – Германская форма публичного объявления. – Происхождение форм вотчинной записки. Основные начала и формы новой германской системы. – История французской транскрипции до закона 1855 года. Регистрация недвижимой собственности в Англии
  17. § 53 Договор подряда с казной. – История законодательства о подряде. – Кто имеет право вступать в подряды. – Личные ограничения. – Общие принадлежности. – Пособия от казны. – Обеспечение и разные его способы. – Залог и ручательство. – Порядок заключения договора. – Подряд оптовый и раздроби- тельный. – Торги. – Запечатанные объявления. – Смешанный способ. – Утверждение договора. – Подряд без торгов.
  18. Реклама работает на вас
  19. Статья 48. Правовые последствия появления физического лица, которое было объявлено умершим
  20. 19.1. Обязательства из публичного обещания награды