Опубликован: 06.10.2011 | Доступ: свободный | Студентов: 1678 / 100 | Оценка: 4.67 / 3.67 | Длительность: 18:18:00
Лекция 3:

Описание синтаксиса

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Контекстно-свободные свойства

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

  • регулярные языки, определяемые регулярной грамматикой;
  • контекстно-свободные языки, задаваемые грамматикой, правила которой описываются продукциями с возможной рекурсией, подобно БНФ;
  • контекстно-зависимые языки, для которых таких продукционных правил недостаточно.

В качестве примера, показывающего, что контекстно-свободная грамматика не может выразить всех свойств, требуемых в большинстве языков программирования, рассмотрим правило задания типа. В типизированных языках, таких как Eiffel, требуется, чтобы для каждого использования сущности x, в выражениях, таких как some_function (x), или в операторах, таких как x.some_procedure, в охватывающем модуле – методе или классе присутствовало объявление сущности в форме:

x: SOME_TYPE
        

Это объявление говорит, что x является локальной переменной метода или его аргументом или полем класса, а тип сущности, используемой, например, в качестве фактического аргумента при вызове функции, должен соответствовать типу SOME_TYPE, заданному при объявлении аргумента. В противном случае программа неверна, и компилятор должен отвергнуть ее. Но это нарушение другого рода в сравнении с ошибками синтаксиса, такими как:

if c then a + b end
        

Здесь нарушаются правила БНФ-грамматики, требующие, чтобы после if следовал оператор, а не выражение (как в примере).

Можно привести массу примеров, когда образцы, удовлетворяющие БНФ-грамматике, являются ошибочными в языке программирования: один из простейших – это оператор присваивания a: = b, где тип b не соответствует типу a.

Контекстно-свободные грамматики и БНФ не могут описать такие правила. Чтобы справиться с ними, грамматика должна ощущать контекст – быть контекстно-зависимой. Правило контекстно-свободной грамматики БНФ позволяет всегда заменять нетерминал А цепочкой μ, состоящей из терминалов и нетерминалов. Правило контекстно-зависимой грамматики позволяет заменять нетерминал А цепочкой μ только в определенном контексте, который можно задать в виде цепочки α, определяющей левый контекст, и цепочки β, задающей правый контекст. Правило такой грамматики говорит, что цепочку αAβ с нетерминалом А можно заменить цепочкой αμβ

На практике нет формализма для контекстно-зависимых грамматик, сравнимых по простоте и практичности с БНФ. Поэтому разработчики компиляторов предпочитают:

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

Языки классифицируются как регулярные (Тип 3), контекстно-свободные (Тип 2), контекстно-зависимые с неукорачивающими правилами (Тип 1) и неограниченные (Тип 0, для распознавания которых необходима Машина Тьюринга, другими словами, вся мощь языка программирования). Эта классификация пришла из статей, опубликованных в 1956 и 1959 годах профессором MIT Ноами Чомски (Noam Chomsky, по-русски часто произносится как Хомский) и Марком Шютценбергером (Marco Shutzennberger) из университета Paris. Хомский известен также как политический деятель, его научные интересы связаны с изучением структур естественных языков. Его работы открыли новое направление в лингвистике и доказали продуктивность в изучении и понимании формальных языков и языков программирования.

Ноам Хомский (2005)

Рис. 2.5. Ноам Хомский (2005)
Рави Сети (2008)

Рис. 2.6. Рави Сети (2008)
Моника С. Лам (2008)

Рис. 2.7. Моника С. Лам (2008)

2.7. Дальнейшее чтение

  1. Alfred V. Aho, Monica S. Lam, Ravi Sethi and Jeffrey D. Ullman: Compilers: Principles, Techniques and Tools, Addison-Wesley, 2008.

    На русском языке: Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман Компиляторы: принципы, технологии и инструментарий, 2 издание, Издательский дом "Вильямс".

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

  2. Dick Grune, Henri E. Bal, Ceriel J.H. Jacobs and Koen G. Langendoen: Modern Compiler Design; Wiley, 2000.

    Хорошее описание современной технологии построения компиляторов.

  3. Steven S. Muchnick: Advanced Compiler Design and Implementation; Morgan Kaufmann, 1997.

    Еще одно описание важных методов построения компиляторов.

2.8. Ключевые концепции, изучаемые в этой лекции

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

Новый словарь

BNF БНФ Choice production Продукция "Выбор"
Concatenation production Продукция "Конкатенация" Defining production Определение продукции
Grammar Грамматика Lexical construct Лексическая категория
Lexical grammar Лексическая грамматика Metalanguage Метаязык
Recursive grammar Рекурсивная грамматика Repetition production Продукция "Повторение"
Phrase Предложение Production Продукция
Top construct Вершинная категория (начальный символ грамматики) Vocabulary Словарь

2.9. Упражнения

2.9.1. Словарь

Дайте точные определения терминам словаря.

2.9.2. Карта концепций

Добавьте новые термины в ранее построенную карту концепций для предыдущих лекций.

2.9.3. БНФ для лексических грамматик

Напишите БНФ-грамматику, которая полностью описывает формы, применяемые в Eiffel для Identifier, Integer, Integer_constant.

2.9.4. Язык, определяемый рекурсивной грамматикой

Рассмотрите язык, определяемый рекурсивной грамматикой с вершинным символом Game.

  1. Докажите, что любой образец в Game1 в нерекурсивной грамматике или, другими словами, любая последовательность из одного или более heads или tails, заканчивающаяся единственным символом stop, является образцом Game.
  2. Верно ли, что любой образец Game является образцом Game1? Дайте ответ и обоснуйте его.

2.9.5. Регулярная грамматика с одной продукцией

Выпишите единственное регулярное выражение, которое полностью описывает язык, генерируемый категорией Game.

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >