Скачиваний:
0
Добавлен:
09.09.2026
Размер:
76 Кб
Скачать

Бараева Елизавета

2383

МЛиТА, лекционное задание

Построение синтаксического анализатора

Вариант 31

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

Пример. Правильная запись: [(()())](([][()]))[()[()()]]

Неправильная запись: [()([]([]()))]

1. Составление примеров и контрпримеров

Примеры

Контрпримеры

[]

[[[]]]

()

[([([])])]

((())[()[]()])

((())[()[]()[]])

((())[()[]()])[()()()]

((())[()[]()])[

[]()[]()[]

[ ]( )[ ]( )[ ]

[(()())](([][()]))[()[()()]]

[()([]([]()))]

2. КС-грамматика языка

<grammar> ::= <итерация><итерация>*

<итерация> ::= [<квад. ск.>] | (<итерация>*)

<квад. ск.> ::= <круг. ск.>*<окончание>

<окончание> ::= [<круг. ск.>*]<круг. ск.>* | Λ

<круг. ск.> ::= (<круг. ск.>*)

| – нетерминальный символ, логическое “ИЛИ”;

* – нетерминальные символы, обозначение того, что то, после чего стоит, может повториться любое (целое от 0 до бесконечности) количество раз.

3. Грамматический разбор примера “((())[()[]()])”

<grammar>

<итерация><итерация>*

<итерация>

(<итерация>*)

(<итерация><итерация>)

((<итерация>*)<итерация>)

((<итерация>)<итерация>)

(((<итерация>*))<итерация>)

((())<итерация>)

((())[<квад. ск.>])

((())[<круг. ск.>*<окончание>])

((())[<круг. ск.><окончание>])

((())[(<круг. ск.>*)<окончание>])

((())[()<окончание>])

((())[()[<круг. ск.>*]<круг. ск.>*])

((())[()[]<круг. ск.>*])

((())[()[]<круг. ск.>])

((())[()[](<круг. ск.>*)])

((())[()[]()])

4. Однозначность ветвления

Элемент грамматики

Множества терминальных символов над элементами грамматики

Пересечения множеств

<итерация>

FIRST(<итерация>) = { '[', '(' }

{ '[' } ∩ { '(' } = ∅

<квад. ск.>

FIRST(<квад. ск.>) = { '(', '[' }

FOLLOW(<квад. ск.>) = { ']' }

{ '(', '[' } ∩ { ']' } = ∅

<окончание>

FIRST(<окончание>) = { '[' }

FOLLOW(<окончание>) = { ']' }

{ '[' } ∩ { ']' } = ∅

<круг. ск.>

FIRST(<круг. ск.>) = { '(' }

FOLLOW(<круг. ск.>) = { '[', ']', ')' }

{ '(' } ∩ { '[', ']', ')' } = ∅

Ветвление однозначно.

И значит грамматика принадлежит классу LL(1).

5. Модифицированная КС-грамматика языка (LL(1))

Совпадает с изначально построенной грамматикой языка

6. Перевод грамматики языка в синтаксическую диаграмму.

Правило

Диаграмма

<grammar> ::= <итерация><итерация>*

<итерация> ::= [<квад. ск.>] | (<итерация>*)

<квад. ск.> ::= <круг. ск.>*<окончание>

<окончание> ::= [<круг. ск.>*]<круг. ск.>* | Λ

<круг. ск.> ::= (<круг. ск.>*)



7. Перевод синтаксической диаграммы в алгоритм.

Диаграмма

Алгоритм

fun grammar {

P(<итерация>);

while ch ∈ L(<итерация>) {

P(<итерация>);

}

}

fun iteration {

if ch = ‘(’ then {

read(ch);

while ch ∈ L(<итерация>) {

P(<итерация>);

}

if ch = ‘)’ then read(ch) else error;

} else;

if ch = ‘[’ then {

read(ch);

P(<квад. ск.>);

if ch = ‘]’ then read(ch) else error;

} else error;

}

fun square_brackets {

while ch ∈ L(<круг. ск.>) {

P(<круг. ск.>);

}

P(<окончание>);

}

fun end {

if ch = ‘[’ then {

read(ch);

while ch ∈ L(<круг. ск.>) {

P(<круг. ск.>);

}

if ch = ‘]’ then read(ch) else error;

while ch ∈ L(<круг. ск.>) {

P(<круг. ск.>);

}

} else;

}

fun round_brackets {

if ch = ‘(’ then read(ch) else error;

while ch ∈ L(<круг. ск.>) {

P(<круг. ск.>);

}

if ch = ‘)’ then read(ch) else error;

}

8. Перевод алгоритма в программу.

Алгоритм

Программный код на Python

fun grammar {

P(<итерация>);

while ch ∈ L(<итерация>) {

P(<итерация>);

}

}

def grammar():

iteration()

while ch in ['[', '(']:

iteration()

fun iteration {

if ch = ‘(’ then {

read(ch);

while ch ∈ L(<итерация>) {

P(<итерация>);

}

if ch = ‘)’ then read(ch) else error;

} else;

if ch = ‘[’ then {

read(ch);

P(<квад. ск.>);

if ch = ‘]’ then read(ch) else error;

} else error;

}

def iteration():

if ch == '(':

read()

while ch in ['[', '(']:

iteration()

if ch == ')':

read()

else:

raise SyntaxError("Error")

elif ch == '[':

read()

square_brackets()

if ch == ']':

read()

else:

raise SyntaxError("Error")

else:

raise SyntaxError("Error")

fun square_brackets {

while ch ∈ L(<круг. ск.>) {

P(<круг. ск.>);

}

P(<окончание>);

}

def square_brackets():

while ch in ['(']:

round_brackets()

end()

fun end {

if ch = ‘[’ then {

read(ch);

while ch ∈ L(<круг. ск.>) {

P(<круг. ск.>);

}

if ch = ‘]’ then read(ch) else error;

while ch ∈ L(<круг. ск.>) {

P(<круг. ск.>);

}

} else;

}

def end():

if ch == '[':

read()

while ch in ['(']:

round_brackets()

if ch == ']':

read()

else:

raise SyntaxError("Error")

while ch in ['(']:

round_brackets()

fun round_brackets {

if ch = ‘(’ then read(ch) else error;

while ch ∈ L(<круг. ск.>) {

P(<круг. ск.>);

}

if ch = ‘)’ then read(ch) else error;

}

def round_brackets():

if ch == '(':

read()

else:

raise SyntaxError("Error")

while ch in ['(']:

round_brackets()

if ch == ')':

read()

else:

raise SyntaxError("Error")

9. Исходный код программы

main.py

def grammar():

iteration()

while ch in ['[', '(']:

iteration()

def iteration():

if ch == '(':

read()

while ch in ['[', '(']:

iteration()

if ch == ')':

read()

else:

raise SyntaxError("Error")

elif ch == '[':

read()

square_brackets()

if ch == ']':

read()

else:

raise SyntaxError("Error")

else:

raise SyntaxError("Error")

def square_brackets():

while ch in ['(']:

round_brackets()

end()

def end():

if ch == '[':

read()

while ch in ['(']:

round_brackets()

if ch == ']':

read()

else:

raise SyntaxError("Error")

while ch in ['(']:

round_brackets()

def round_brackets():

if ch == '(':

read()

else:

raise SyntaxError("Error")

while ch in ['(']:

round_brackets()

if ch == ')':

read()

else:

raise SyntaxError("Error")

def read():

global pos, ch

pos += 1

if pos < len(input_str):

ch = input_str[pos]

else:

print("Reading is complete!")

input_str = input()

pos = 0

ch = input_str[0]

grammar()

10. Исполняемый файл программы

https://python.codeutility.io/ru/434qj2

4

Соседние файлы в папке ИДЗ и лабы по МЛиТА 2025