86 lines
3.0 KiB
Python
86 lines
3.0 KiB
Python
from finite_automaton import FiniteAutomaton
|
||
|
||
|
||
def main():
|
||
alphabet = set("+-0123456789.eE")
|
||
initial_state = "S0"
|
||
final_states = {"S2", "S3", "S5", "S7", "S10"}
|
||
|
||
transitions = {
|
||
"S0": [("+-", "S1"), ("123456789", "S2"), ("0", "S3"), (".", "S6")],
|
||
"S1": [("123456789", "S2"), ("0", "S3"), (".", "S6")],
|
||
"S2": [("0123456789", "S2"), (".", "S5"), ("eE", "S8")],
|
||
"S3": [("0", "S3"), ("123456789", "S4"), (".", "S5"), ("eE", "S8")],
|
||
"S4": [("0123456789", "S4"), (".", "S5"), ("eE", "S8")],
|
||
"S5": [("0123456789", "S5"), ("eE", "S8")],
|
||
"S6": [("0123456789", "S7")],
|
||
"S7": [("0123456789", "S7"), ("eE", "S8")],
|
||
"S8": [("+-", "S9"), ("0123456789", "S10")],
|
||
"S9": [("0123456789", "S10")],
|
||
"S10": [("0123456789", "S10")],
|
||
}
|
||
|
||
automaton = FiniteAutomaton(
|
||
transitions=transitions,
|
||
initial_state=initial_state,
|
||
final_states=final_states,
|
||
alphabet=alphabet,
|
||
)
|
||
|
||
print("Конечный автомат для распознавания форматов вещественных чисел")
|
||
print("=" * 60)
|
||
print("Варианты команд:")
|
||
print(" - check <строка> - проверить, соответствует ли строка автомату")
|
||
print(
|
||
" - gen [<вероятность_остановки>] - сгенерировать случайную строку (по умолчанию 0.3)"
|
||
)
|
||
print(" - q - выход из программы")
|
||
print("=" * 60)
|
||
|
||
while True:
|
||
command = input("\nВведите команду: ").strip()
|
||
|
||
if not command:
|
||
continue
|
||
|
||
parts = command.split()
|
||
cmd = parts[0].lower()
|
||
|
||
if cmd == "q":
|
||
print("Выход из программы.")
|
||
break
|
||
|
||
elif cmd == "check":
|
||
input_string = ""
|
||
if len(parts) > 1:
|
||
input_string = " ".join(parts[1:]).strip()
|
||
|
||
message, transitions = automaton.process_input(input_string)
|
||
|
||
print(f"Результат: {message}")
|
||
print("Путь переходов:", " -> ".join(transitions))
|
||
|
||
elif cmd == "gen":
|
||
stop_prob = 0.3
|
||
if len(parts) > 1:
|
||
try:
|
||
stop_prob = float(parts[1])
|
||
if not (0 < stop_prob <= 1):
|
||
raise ValueError(
|
||
"Вероятность должна быть больше 0 и меньше либо равна 1"
|
||
)
|
||
except ValueError as e:
|
||
print(f"Ошибка: {e}")
|
||
continue
|
||
|
||
random_string, path = automaton.generate_random_string(stop_prob)
|
||
print(f"Сгенерированная строка: {random_string}")
|
||
print("Путь переходов:", " -> ".join(path))
|
||
|
||
else:
|
||
print(f"Неизвестная команда: {cmd}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|