В директорията src/
има 3 файла с класове:
- tokenizer.py - Tokenizer разбива string на отделни парчета
- iterator.py - Позволява консумирането на елементи от list/Tokenizer 1 по 1
- json_parser.py - Конструира python dict/list който отговаря на валиден JSON string подаден като Iterator Препоръчваме имплементирането им в тази последователност.
Всеки метод/клас/функция имат допълнително описание как трябва да работят.
Препоръчваме използвамето на Gitpod, за който има автоматична конфигурация на средата.
В противен случай препоръчваме работа UNIX машина (или linux subsystem for windows)
Тези 2 инструмента улесняват работата по задачата (ако не ги ползвате ще трябва да създадете ръчно virtualenv и да пускате тестовете с python -m pytest
):
В директорията на проекта трябва да включите direnv
$ direnv allow
В директорията на проекта може да използвате:
$ just test # run all tests
$ just coverage # generate coverage information for the code
$ just coverage-html # generate coverage information in a html page (highlighting (un)covered lines)
Преобразуването на текст (string) до машинни обекти/инструкции е често срещана задача. Примери:
- компилаторите преобразуват текст до машинни инструкции
- текст като JSON може да бъде конвертиран до обект във всеки програмен език
- често данни от проучвания се разпространяват като CSV. За работа с тези файлове се изисква csv-parser който конвертира файла до таблица в паметта
Всички тези задачи се решават по един и същи начин:
- Tokenizer - разбиване на текста на значещи символи/думи наречени токени
- Parser - Конвертиране на отелните токени до сложни структури (списъци, таблици, дървета, обекти). Ако искаме единствено да разглеждаме данните тази стъпка обикновено е последна.
- Compiler - Използване на структурираните данни от Parser-а за допълнителна обработка. Тази стъпка се използва само в случаи когато е необходимо допълнително обработване на данните. Обикновено тази стъпка е доста сложна и е винаги различна.
За това задание ще реализираме стъпка 1 и 2. От текст (сериализиран JSON) ще създадем обекти в Python (ще десериализираме JSON string). Между стъпка 1 и 2 ще използваме Iterator - клас който ще ни позволи да консумираме токените 1 по 1. Повечето програмни езици имат вградени структури/методи които представляват този Iterator, но ние ще го реализираме като отделен клас.
Това задание е мотивирано от курса nand2tetris в който се имплементира компилатор като се започва от hardware gates.