ИДЗ и лабы по МЛиТА 2025 / Вариант 31
.docxБараева Елизавета
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
