
- •Структура компилятора. Типы транслирующих программ.
- •Определение языка. Синтаксис и семантика.
- •Порождающие грамматики Хомского. Примеры порождающих грамматик.
- •Контекстно-свободные грамматики.
- •Деревья вывода. Канонические выводы. Двусмысленные порождающие грамматики
- •Любой язык может быть порожден бесконечным числом грамматик.
- •Лексический анализ.
- •Пример структуры программы сканирования
- •Ll(n) и lr(n) – грамматики.
- •Ll(k)-грамматики
- •Lr(k) грамматики
- •Построение синтаксического графа.
- •Восходящий синтаксический анализ.
- •Пример:
- •Работа с таблицей символов.
- •Реализация в виде массива
- •Реализация в виде цепочной структуры (связанного списка)
- •2. Дополнительные затраты памяти, поскольку хранятся ссылки на последующий и, возможно, предыдущий элемент На практике также встречается комбинация этих подходов.
- •Восстановление при синтаксических ошибках.
- •Постфиксная запись.
- •Методы генерирования кода.
Постфиксная запись.
Обычные арифметические выражения, используемые в повседневной практике и содержащие скобки, называют инфиксными выражениями, поскольку знак операции располагается между операндами. Порядок выполнения действий в таких выражениях определяется старшинством операций и скобками. Вычисление и компиляция таких выражений подразумевает их предварительный анализ с целью выявления порядка выполнения операций.
Постфиксная запись отличается тем, что знак операции ставится непосредственно за операндами. Так, например, инфиксной записи (A+B) соответствует постфиксная форма AB+.
Постфиксная польская запись (ПоПЗ) определяется следующим образом.
Если инфиксное выражение Е представляет собой один операнд а, то ПоПЗ выражения Е – это а.
Если инфиксное выражение Е1*Е2 , где * – знак операции, E1, E2 – инфиксные выражения для операндов, то ПоПЗ этого выражения это – Е1'E2'*, где Е1', E2 ' – постфиксные выражения Е1 ,Е2 .
Если (Е) есть инфиксное выражение, то постфиксная запись этого выражения есть постфиксная запись Е.
Аналогично предыдущему примеру построим ПоПЗ выражения (a + b) * (c - d).
Обозначая операнды внешней операции E1 = (a + b) и E2 = (c - d) найдем постфиксные записи операндов, которые имеют вид: E1' = ab+ и E2' = cd-
Подставляя полученные постфиксные записи в выражение E1'E2'* окончательно получаем: ab+cd-*
Постфиксная запись выражений обладает двумя ценными свойствами, благодаря которым ее широко используют в компиляторах: Для записи любого выражения не нужны скобки. Так как оператор непосредственно следует за операндами, участвующими в операции, неопределенность в указании операндов отсутствует. Например, выражение (A+B)+C имеет постфиксную форму AB+C+, а выражение A+(B+C) представляется в форме ABC++.
К моменту считывания очередного оператора соответствующие операнды уже были прочитаны. Поэтому оператор может быть выполнен без считывания каких-либо дополнительных данных.
Сказанное выше относится к бинарным операциям, однако это нетрудно распространить на унарные операции. Так, унарный оператор отрицания (эту операцию будем обозначать знаком ~) просто ставят непосредственно за аргументом. Например, инфиксная запись ~A представляется в форме A~, а выражение ~(A+B) преобразуется в AB+~. (Заметим, что знак "-" может стоять в инфиксной записи, указывая как бинарную, так и унарную операцию, и его правильный смысл становится очевидным из контекста. В постфиксной записи это сделать труднее.
В результате вычислений значение выражения оказывается единственным элементом стека.
Очевидно, что вычисление постфиксной записи выражения не представляет трудности, преобразование же инфиксной записи в постфиксную заметно сложнее. Предположим, что продукция языка имеет вид A→BиC, где A, B и C являются нетерминалами, а "и" – терминал. Будем считать, что знаки операций являются терминалами. Тогда эта продукция означает, что нетерминал A является инфиксной записью, в которой участвуют операнды B и C вместе с оператором "и". Следовательно, постфиксная форма выражения образуется из операндов B, C, за которыми следует оператор "и". Таким образом, для данной продукции постфиксная запись имеет вид
Постфиксная запись для B, Постфиксная запись для C и Если терминальные символы выводятся в выходной файл в таком
порядке, то все фразы языка будут представлены в постфиксной форме.