Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компютерні системи штучного інтелекту_методичні...doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
521.73 Кб
Скачать

2.1. Програма роботи та завдання.

2.1.1. Створити в середовищі Turbo Prolog програму з прикладу та дослідити її.

2.1.2. Задати різні варіанти цілей та проаналізувати отримані результати.

2.1.3. Зафіксувати результати.

2.1.4. Виправити наявні помилки.

2.1.5. Зафіксувати у звіті вихідні код створеної програми та логіку її роботи.

2.1.6. Відповісти письмово на контрольні питання.

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

  1. У чому суть лексикографічного упорядкування?

Лабораторне заняття № 9

Тема: Розв’язання задачі синтаксичного аналізу

Мета роботи. Розглянути задачу синтаксичного аналізу для деякої примітивної мови паскалеподібного типу; проаналізувати отримані результати.

1. Теоретичні відомості

Програма працює наступним чином:

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

2. Предикат s_statement приймає той же список лексем і перевіряє чи зможуть лексеми бути разділені на індивідуальні твердження, кожне з яких завершується крапкою з комою.

3. Предикат s_statement перевіряє чи будуть перші лексеми з списку лексем допорожніимими твердженнями. Якщо так, тоді твердження повертається в структуру, а ті лексеми, що залишились повертаються в s_statement.

а) Чотири фрази s_statement відповідають чотирьом типам операторів псевдопаскалю. Вони аналізуються послідовно.

б) Потім проводиться порівняння з виразами.

4. Предикати sexp, s_exp1 і s_exp2 працюють аналогічно з s_statment, але лише стосовно виразів.

Якщо системі побудувати запит:

goal: tokl("b=2; if b then a=1 else a=2 fi; do a=a-1 while a ; ", Ans), s_program(Ans,Res)

тоді вона побудує відповідь: Ans = ["b", "=",...] Res = program([assign("b", int(2)), if_then_else(var("b"), assign("a",int(1))........])

2. Практична частина

domains

toklist = string*

predicates

tokl(string, toklist)

clauses

tokl(Str, [H | T]):-fronttoken(Str,H,Str1),!, tokl(Str1,T).

tokl(_,[]).

/* Друга частина програми є синтаксичним аналізатором */

domains

program = program(statementlist)

statementlist = statement*

/* визначення типу оператора */

statement = if_Then_Else(exp,statement, statement); if_Then(exp,statement);

while(exp,statement); assign(id,exp)

/* визначення виразу */

exp = plus(exp,exp); mines(exp,exp); var(id); int(integer)

id = string

predicates

s_program(toklist, program)

s_statement(toklist, toklist, statment)

s_statementlist(toklist, toklist, statmentlist)

s_exp(toklist, toklist, exp)

s_exp1(toklist, toklist, exp, exp)

s_exp2(toklist, toklist, exp)

clauses

s_program(List1, program(Statementlist)):- s_statementlist(List1, List2, Statementlist),

List2 = [].

s_statementlist([], [],[]):-!.

s_statementlist([List1, List4, [Statement | Program]):- s_statement(List1, List2, Statement), List2 = [";" | List3], s_statementlist(List3, List4, Program).

s_statement(["if" | List1], List7, if_theh_else(Exp,Statement1, Statement2)):-

s_exp(List1,List2, Exp), List2 = [ "then" | List3], s_statement(List3, List4, Statement1),

List4 = ["else" | List5],!, s_statement(List5, List6, Statement2), List6 = ["fi" | List7].

s_statement([" if.....

. .

s_statement([ " do .....

. . .

s_statement([Id | List1], List3, assign(Id,Exp)):-

isname(Id), List1 = ["=" | List2], s_exp(List2,List3,Exp).

s_exp(List1,List3,Exp):- s_exp2(List1,List2,Exp1), s_exp1(List2,List3,Exp1,Exp).

s_exp1(["+" | List1],List3,Exp1,Exp):-!, s_exp2(List1,List2,Exp2),

s_exp1(List2,List3,plus(Exp1,Exp2), Exp).

s_exp1(["-" ........

s_exp1(List,List,Exp,Exp).

s_exp2([Int | Rest],Rest, int(I)):-str_int(Int,I),!.

s_exp2([Id | Rest],Rest,var(Id)):-isname(Id).