В этой практике мы будем применять ранее созданный и протестированный АКА. Применять мы будем его прямо по его назначению - разбор грамматик.
Напишите новую реализацию токенайзера (лексера) из Практика 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 формата в 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.
Зачем нужен конфиг? На самом деле это то, ради чего и делают автоматы. Самое важное - спроектировать функции обработчики, а потом их можно комбинировать разными способами. Для комбинирования и перебора вариантов автомата, для добавления новых состояний и переходов не надо менять код, достаточно только поправить конфиг. Нет перекомпиляции приложения, только изменение конфига.
Советуем использовать следующие форматы конфигов:
Добавить поддержку ссылок, изображений, участка кода в ваш markdown компилятор.