knu/csc/appl-math/c3s2/sys-prog

синтез і аналіз мовних процесорів

Зміст:

Синтаксична діаграма

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

Оскільки вершини такого графа не іменуються, то вони припускаються неявно. Синтаксична діаграма позначається іменем нетермінала, для якого вона будується.

Мета побудови синтаксичних діаграм для мови програмування на основі КС-граматики:

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

Сформулюємо правила побудови синтаксичного графа:

  1. Кожен нетермінал з відповідною множиною породжуючих правил , , відображається в один синтаксичний граф.

    Отже, кількість синтаксичних графів рівна кількості нетерміналів граматики .

  2. Для кожного елемента слова , , будуємо ребро синтаксичного графа та покажемо його таким чином що:

    • якщо , , де — вихідна лексема, то будуємо таке ребро:

      img-16

    • якщо — нетермінал граматики, то будуємо таке ребро:

      img-17

Тоді, коли правило граматики має вигляд для побудови діаграми скористаємося обома способами:

img-18

Коли правило граматики має вигляд , то відповідний синтаксичний граф буде мати вигляд:

img-19

де замість будуються відповідні синтаксичні діаграми.

Якщо на основі граматики мови програмування побудована множина синтаксичних графів, то можна спробувати зменшити їх кількість, скориставшись підстановкою одних графів у інші. При цьому замість елемента підставляється його синтаксичний граф. Таким чином можна зменшити кількість синтаксичних графів. Для того, щоб забезпечити детермінований синтаксичний аналіз з переглядом вперед на одну лексему, потрібно накласти певні обмеження, а саме: для кожного правила виду з синтаксичною діаграмою наведеного вище вигляду необхідне виконання наступної умови: множини , повинні попарно не перетинатися. Зрозуміло, що ця умова гарантує детермінований вибір шляху при русі по синтаксичній діаграмі.

Код

Подальше програмування синтаксичного аналізатора можна звести до наступних примітивів:

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

Одна особливість

Досить часто при визначенні синтаксису мови програмування користуються синтаксичними правилами виду . Тоді синтаксична діаграма буде мати вигляд:

img-24

Для вище наведеної синтаксичної діаграми відповідні множини будуть: . Відповідний фрагмент програми мовою С матиме вигляд:

extern int lexem_code;
extern char lexem_text[];
void A_i(void) {
	while (
		lexem_code == code_a_1_1 ||
		lexem_code == code_a_1_2 ||
		... ||
		lexem_code == code_a_1_n_1
	) {
		...  // фрагмент програми для слова w
	}
}  // кінець підпрограми для нетермінала A_i

Виконавши аналіз варіантів побудови синтаксичного аналізатора на основі синтаксичних діаграм, покажемо вигляд основної — main-програми:

int lexem_code;
char lexem_text[1<<8];
int main () { 
	get_lexem();
	axiom();  // процедура, пов'язана з аксіомою S граматики
}

Контрольні запитання

  1. Який граф називається синтаксичною діаграмою?

  2. Як на синтаксичній діаграмі позначаються термінали і нетермінали?

  3. Як на синтаксичній діаграмі позначаються прості (без ) і складені (з ) правила?

  4. Напишіть фрагмент коду (наприклад на мові С) для обробки терміналів і нетерміналів.

  5. Напишіть фрагмент коду (наприклад на мові С) для обробки простих (без ) і складених (з ) правил.

  6. Як на синтаксичній діаграмі позначаються правила вигляду ?

  7. Напишіть фрагмент коду (наприклад на мові С) для обробки правил вигляду .

(традиційні відповіді можна переглянути у коментарях у вихідному коді цієї сторінки)

Назад до лекцій

Назад на головну