Использование абстрактного конечного автомата

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

Задание Tokenizer

Напишите новую реализацию токенайзера (лексера) из Практика 11 про польский калькулятор, которая будет использовать АКА. То есть ваш токенайзер должен обрабатывать последовательно посимвольно входящее выражение и выдать в результате последовательность токенов. Каждый токен должен быть помечен как число или операция.

from typing import Dict, Tuple, List
from abc import abstractmethod

"""
Пример токена, можно и по-другому. Но главное одно - теперь токен знает то, что он хранит.
"""

class Token:
	@abstractmethod
	def value():
		# это интерфейс, код добавлять не надо
		pass

class FloatToken(Token):
	def value():
		# тут ваш код
		pass

class OperationToken(Token):
	def value():
		# тут ваш код
		pass

class Tokenizer:
	"""
	Это интерфейс токенайзера, Он должен быть таким.
	"""
	@abstractmethod
	def tokenize(expression: str) -> List[Token]
		# тут используется абстрактный конечный автомат
		pass

Задание Markdown

Написать конвертер из упрощенного Markdown формата в HTML. Можете посмотреть как работает markdown на сайте: Stackedit.

# Hello -> <h1>Hello</h1>
## World -> <h2>World</h2>

*italic* -> <i>italic</i>
**bold** -> <b>bold</b>

- one
- two
<ul>
  <li>one</li>
  <li>two</li>
</ul>

> some quote -> <blockquote>some quote</blockquote>

В результате должна получиться консольная программа, которая на вход получает путь до *.md файла, и сохраняет рядом с ним соответсвующий *.html файл.

Пример использрвания:

python -m md_to_html /Users/ilya/Documents/univer/page.md

open /Users/ilya/Documents/univer/page.html # откроет браузер на macOS

Задание "Конфиг автомата"

Придумайте формат конфигурационного файла, в котором вы можете проектировать состояния и переходы автомата. Сделайте конфиг для решения задачи Markdown.

Зачем нужен конфиг? На самом деле это то, ради чего и делают автоматы. Самое важное - спроектировать функции обработчики, а потом их можно комбинировать разными способами. Для комбинирования и перебора вариантов автомата, для добавления новых состояний и переходов не надо менять код, достаточно только поправить конфиг. Нет перекомпиляции приложения, только изменение конфига.

Hints

Советуем использовать следующие форматы конфигов:

Задание Markdown+ (не обязательно)

Добавить поддержку ссылок, изображений, участка кода в ваш markdown компилятор.