Практика 13
Использование абстрактного конечного автомата
В этой практике мы будем применять ранее созданный и протестированный АКА.
Применять мы будем его прямо по его назначению - разбор грамматик.
Задание 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 компилятор.
[GitHub](http://github.com) -> <a href='http://github.com'>GitHub</a>
![My image](http://example.org/image.png) -> <img src='http://example.org/image.png' alt='My image'>
```
a = 1 + 3
def a():
print('Hello')
```