Пред.Страница След.Страница  Раздел Содержание


7.1. Синтаксис и семантика входного языка

В качестве демонстрационного примера для построения атрибутного преобразователя возьмем подмножество входного языка, описанного в разделе 6.2.Для того чтобы  сократить сложность процедуры построения АТ-преобразователя, и чтобы сделать эту процедуру  более наглядной, удалим правил определяющие числа и комментарии. При этом сохраняется возможность использования уже построенного в разделе 6 лексического анализатора, поскольку числа не будут появляться на входе, а комментарий в лексическом анализаторе обрабатывается на этапе чтения входных символов с помощью эвристического приема. В результате получаем грамматику задающую последовательность операторов присваивания с логическими выражениями. Чтобы получить грамматику, задающую  входной язык преобразователя на этапе  синтаксического анализа, следует из грамматики приведенной в разделе 6.2 заменить определения лексем соответствующими терминальными символами. В результате получаем грамматику  в следующем виде:

 

<Программа> ::= "{"<Описание_ перемен>
                      <Последовательность_операторов>"}"

<Описание_ перемен> ::= "bool"<Про_описание1>

<Про_описание1> ::=":""Идентификатор" <Про_описание2>

<Про_описание2> ::= ",""Идентификатор"<Про_описание2>

<Про_описание2> ::= ";"

<Последовательность_операторов> ::= <Оператор>
                          <Про_последовательность>

<Про_последовательность> ::= <Оператор><Про_последовательность>

<Про_последовательность> ::= $

<Оператор> ::= "Идентификатор"<Про_оператор>

<Про_оператор> ::= "="<Выражение>";"

<Выражение> ::= <Терм><Про_выражение>

<Про_выражение> ::= "|" <Терм><Про_выражение>

<Про_выражение> ::= $

<Терм> ::= <Фактор><Про_терм>

<Про_терм> ::= "&" <Фактор><Про_терм>

<Про_терм> ::= $

<Фактор> ::= <Факт>

<Фактор> ::=  "~"<Факт>

<Факт>::="Идентификатор"

<Факт>::= "("<Выражение>")"

<Факт>::= "false"

<Факт>::= "true"

 

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

1)      Каждая переменная программы должен быть описана.

2)      Каждая переменная программы должен быть описана только один раз.

3)      Каждая переменная программы должна получить значение.

4)      Каждая переменная программы должна быть использована хотя бы один раз.

5)      Число переменных в программе не должно превышать 128.

6)      Число выходных атомов, создаваемых программой не должно превышать 256.

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

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

Треть соглашение говорит о том, что каждая переменная должна быть использована хотя бы один раз в левой части оператора присваивания.

Четвертое соглашение требует, чтобы каждая описанная переменная была использована хотя бы один раз в правой части какого либо оператора присваивания.

Соглашения пять и шесть являются примерами ограничений реализации и, в основном, определяют размеры таблиц АТ‑преобразователя.


Пред.Страница След.Страница  Раздел Содержание