Описание этапа синтаксического анализа

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

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

Построение КС-грамматики входного языка

Для построения КС-грамматики входного языка необходимо:

1. Заменить металингвистические переменные БНФ обозначениями нетерминальных символов, используя короткие имена;

2. В качестве терминальных символов использовать токены;

3. Металингвистический символ «::=» заменить символом «à»;

4. Заменить одну металингвистическую формулу с n альтернативами на n правил грамматики с одинаковым символом в левой части правила вывода;

5. Исключить металингвистические символы [ ] и { }, включив в правила грамматики e-правила и рекурсивные правила.

Определение класса КС-грамматики входного языка

Построенная КС-грамматика входного языка должна входить в определенный в задании на курсовую работу класс грамматик. Определение класса КС-грамматики рекомендуется выполнять с помощью лабораторного практикума [2]. Если грамматика не принадлежит заданному классу, то необходимо ее преобразовать. Для преобразования можно использовать алгоритмы и рекомендации, приведенные в [3] – [6].

Разбиение грамматики на подграмматики

Если преобразование КС-грамматики не приведет к нужному результату, то рекомендуется найти правила грамматики, в которых нарушаются требования, предъявляемые к грамматикам заданного класса, после чего выполнить одно или несколько действий из приведенного списка:

1. Изменить (пополнить) список токенов так, чтобы терминальные символы грамматики, приводящие к конфликту, были разбиты на непересекающиеся подмножества.

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

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

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

При разбиении грамматики на подграмматики нужно учитывать следующее.

1. Совокупности выделенных из грамматики взаимосвязанных правил должна представлять собой КС-грамматику.

2. Основной символ подграмматики становится (специальным) терминальным символом исходной грамматики.

3. Если множества нетерминальных символов подграмматики и модифицированной исходной грамматики не пересекаются, то синтаксический анализ для каждой из них может быть реализован при помощи отдельного процессора с магазинной памятью (ДМП-процессора).

Описание промежуточного языка

Тип промежуточного языка, используемого для представления программы после синтаксического анализа, определен в задании на курсовую работу. Описание различных типов промежуточных языков приводится в [1].

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

Фрагмент описания промежуточного языка приводится в табл. 2.4.

Таблица 2.4

Описание тетрады
Синтаксис Семантика
Коп Оп1 Оп2 Рез
BRL Label   Безусловный переход на метку Label
BF Label R Переход на метку Label, если R = False
DEFL Label   Определение метки Label

Неформальное описание перевода

При описании перевода конструкций входного языка в промежуточный язык следует руководствоваться методикой, изложенной в [1]. Рекомендуемая форма описания перевода приведена на рис. 2.3. Для возможности построения ссылок на описание в его заголовке указывается номер первого правила грамматики, описывающего конструкцию. Формы конструкции и тетрады, входящие в ее перевод, нумеруются. Например (j).1.5 – ссылка на тетраду определения метки перевода полной формы условного оператора IF.

( i) Перевод условного оператора IF  
1. Полная форма  
Входная конструкция: Последовательность тетрад:  
IF      
<Выражение> Þ Перевод выражения (R – результат)
THEN   BF Lelse R  
<Операторы> Þ Перевод операторов
ELSE   BRL Lend    
    DEFL Lelse    
<Операторы> Þ Перевод операторов
END   DEFL Lend    
2. Сокращенная форма:  
Входная конструкция: Последовательность тетрад:  
IF      
<Выражение> Þ Перевод выражения (R - результат)  
THEN   BF Lend R    
<Операторы> Þ Перевод операторов  
END   DEFL Lend      
         
Рис. 2.3  
                               

Наши рекомендации