Правки и программа в одном файле

This commit is contained in:
2025-05-20 19:32:48 +03:00
parent a60d2a9db7
commit 5bd140cd39
4 changed files with 737 additions and 28 deletions

View File

@@ -200,32 +200,24 @@ class Grammar:
# Для каждого терминала a в First(w)
for terminal in first_of_rule - {""}:
# Если T[A,a] уже содержит правило, грамматика не LL(1)
if terminal in self.lookup_table[non_terminal]:
raise ValueError(
"Грамматика не является LL(1)-грамматикой.\n"
f"Конфликт в ячейке [{non_terminal}, {terminal}]\n"
f"Новое правило: {non_terminal} -> {' '.join(rule)};\n"
f"Существующее правило: {non_terminal} -> {self.lookup_table[non_terminal][terminal]}"
)
# Добавляем правило в таблицу
self.lookup_table[non_terminal][terminal] = rule
self._add_to_lookup_table(non_terminal, terminal, rule)
# Если эпсилон в First(w), то для каждого b в Follow(A)
if "" in first_of_rule:
for terminal in self.follow_sets[non_terminal]:
# Если T[A,b] уже содержит правило, грамматика не LL(1)
if terminal in self.lookup_table[non_terminal]:
raise ValueError(
"Грамматика не является LL(1)-грамматикой.\n"
f"Конфликт в ячейке [{non_terminal}, {terminal}]\n"
f"Новое правило: {non_terminal} -> {' '.join(rule)};\n"
f"Существующее правило: {non_terminal} -> {self.lookup_table[non_terminal][terminal]}"
)
self._add_to_lookup_table(non_terminal, terminal, rule)
# Добавляем правило в таблицу
self.lookup_table[non_terminal][terminal] = rule
def _add_to_lookup_table(self, non_terminal, terminal, rule):
if terminal in self.lookup_table[non_terminal]:
raise ValueError(
"\nГрамматика не является LL(1)-грамматикой.\n"
f'Распознаваемый нетерминал: "{non_terminal}"\n'
f'Поступающий на вход терминал: "{terminal}"\n'
f"Неоднозначность между правилами:\n"
f"{non_terminal} -> {' '.join(rule)}\n"
f"{non_terminal} -> {' '.join(self.lookup_table[non_terminal][terminal])}"
)
self.lookup_table[non_terminal][terminal] = rule
def format_rules(self) -> str:
result = []