Правки и программа в одном файле
This commit is contained in:
@@ -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 = []
|
||||
|
||||
Reference in New Issue
Block a user