Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
theory-2009-2010.docx
Скачиваний:
4
Добавлен:
05.09.2019
Размер:
5.41 Mб
Скачать

2. Системне програмування

6. Побудова ll(1)-таблиці для управління ll(1)-синтаксичним аналізатором

Таблиця , де ,

Алгоритм роботи -синтаксичного аналізатора (продемонстровано на магазинному автоматі):

  • 0: В стек занесли аксіому, прочитавши поточну лексему b;

  • 1: Якщо на вершині стеку нетермінал , то визначає номер правила, яке заміщає на вершині магазина;

  • 2: Якщо на вершині магазину - поточна лексема, то з вершини стеку зняти , прочитавши нову лексему;

  • 3: Якщо стек порожній, то прочитати всю програму, то "допустити" інакше - "синтаксична помилка";

  • 4: В інших випадках - "синтаксична помилка";

Побудований синтаксичний аналізатор аналізує програму за час пропорційний O(n), використовує лише одну поточну лексему.

2. Системне програмування

7. Атрибутний метод визначення семантики програм. Синтезовані та успадковані атрибути. Порядок та правила обчислення атрибутів.

Синтаксично кероване визначення — узагальнення контекстно-вільної граматики, в якій кожен граматичний символ має зв`язану множину атрибутів, розділену на дві підмножини, – синтезовані і успадковані атрибути цього граматичного символа.

Атрибут може бути чим завгодно, – строкою, числом, типом, адресою пам`яті і т.д. Значення атрибуту у вузлі дерева розбору визначається семантичними правилами, зв`язаними з використованою в даному вузлі продукцією. Значення синтезованого атрибута у вузлі обчислюється по значеннях атрибутів в нащадках даного вузла; значення успадкованих атрибутів визначається значеннями атрибутів сусдніх ( тобто вузлів, що є нащадками по відношенню до батьківського вузла даного ) і батьківського вузлів.

Атрибутний метод визначення семантики програм був запропонований Кнутом.

Ідея: з довільною граматикою пов`язана певна множина атрибутів. Значення одного атрибута обчислюється через значення інших атрибутів. Є правила, в котрих для певних атрибутів вводяться константи або певні значення з таблиць.

Для розрахунку атрибутів фіксується процедура ( на синт. дереві ), наприклад лівосторонній обхід дерева. Якщо атрибутна схема вимагає декілька переглядів дерева, то неефективно.

Проблема: Коректність атрибутної схеми — чи можна для довільного правила побудувати синтаксичне дерево обчислення довільних атрибутів?

Відповідь: Для довільного КВ-граматики не існує алгоритму перевірки коректності атрибутної схеми. Як вихід із положення, Кнут запропонував конкретизацію атрибутів, а саме поділення атрибутів на

  1. успадковані ( int i,j,k – типи “j” та “k” такі ж, як і у “i” ),

  2. синтезовані ( напр. a+b, синтезовані з “а” та “b” за допомогою “+” ).

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

Висновок :

  1. Атрибутну схему з конкретизацією легко перевірити на коректність

  2. Атрибутну схему можна розрахувати за 1 перегляд.

2. Системне програмування

8. Машинно-орієнтовані мови програмування. Асемблери. Структура асемблера, перегляди тексту програми та відповідні бази даних.

Асемблер: машинно-орієнтована мова. Основною одиницею в асемблер-програмі є машинна команда (директива асемблера). На її основі будується машинний код.

Директиви асемблера – це команди, що управляють процесом компіляції. На основі директиви асемблера об’єктний код не будується. Кожна машинна команда чи директива записується в один рядок (або в декілька шляхом продовження).

Між кодами операцій і операціями повинен бути щонайменше один " ". Операнди записуються через кому, без проміжків.

ОП1,ОП2 коментар (коментар може починатись або з "*" або з ";")

Помітка – іменує як команди, так дані (символьне ім’я). В асемблері значення символьного імені є адреса. Repeat – символьне ім’я.

К ожне символьне ім’я кодується парою: (база, зміщення), де база - ім’я сегменту програми, в якому це символьне ім’я визначено.

Оскільки ми не можемо знати наперед абсолютну адресу пам’яті ЕОМ, куди завантажується програма, то асемблер виконує початкове присвоєння абсолютної адреси кожного сегменту значення . Реальна адреса формується під час виконання програми шляхом сумування значення регістру та зміщення, а початкові значення регістрів сегментів приписується операційною системою під час завантаження програми.

А семблер під час обробки програми з кожним сегментом пов’язує лічильник сегменту. Обчислюється як попереднє значення плюс довжина команди. Початкове значення кожного лічильника або встановлюється директивою асемблера.

Оскільки відсутня дисципліна вживання символьних імен, компілятор асемблеру щонайменше двопрохідний:

    1. Попередній перегляд тексту: визначення значень символьних імен, їх адреси (сегмент + зміщення).

    2. Другий перегляд тексту: Дає можливість перевірити код команди, та вказує адреси операндів.

Але в асемблері існують такі імена та значення, які не можна визначити під час компіляції (абсолютна адреса, ім’я зовнішньої функції). Тому в об’єктному коді резервується місце для операнда, а в результуючий файл, в таблиці модуля вказується зміщення в об’єктному коді, котре треба модифікувати.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]