Лабораторная №2 — задание 2.1D #
Нужно написать и покрыть тестами модуль лексического анализа.
⚠️ Обратите внимание #
Это задание выполняется по спецификации, подготовленной аналитиком.
- Спецификация должна появиться до начала кодирования — так же, как и в реальных проектах.
- Вы можете составлять спецификацию совместно с аналитиком, а затем приступить к реализации.
- Ждать проверки спецификации преподавателем не нужно.
Порядок выполнения #
- Получите спецификацию лексики языка у своего аналитика
- Создайте пустой проект реализации:
dotnet new classlib -o src/Lexer- добавьте его в решение:
dotnet sln add src/Lexer
- добавьте его в решение:
- Создайте пустой проект тестов:
dotnet new xunit -o tests/Lexer.UnitTests- добавьте его в решение:
dotnet sln add tests/Lexer.UnitTests - добавьте ссылку на библиотеку из проекта тестов:
dotnet add tests/Lexer.UnitTests reference src/Lexer
- добавьте его в решение:
- Создайте список тестов
tests/Lexer.UnitTests/TESTLIST.md - Заполните список тестов всеми сценариями, которые вы можете придумать по спецификации
- Повторяйте цикл TDD (цикл Red-Green-Refactor), пока не реализуете весь список тестов
- список тестов может меняться на очередных итерациях цикла Red-Green-Refactor
- вы сами выбираете частоту коммитов (git commit)
Подробности здесь: Каноничный TDD и список тестов
Требования к лексеру (лексическому анализатору) #
Учитывайте Требования к коду на C#
- Лексер должен реализовать спецификацию, описанную аналитиком в файле
docs/specification/lexical-structure.mdв вашем репозитории - Лексер должен быть разработан по TDD с применением шаблона «Список тестов»
- список тестов должен быть в формате markdown, описанном ниже
- при сдаче работы нужно будет показать этот список тестов
- тестировать следует именно лексер, а не его компоненты
- не нужно добавлять тривиальные тесты (тесты конструкторов и тому подобное)
- Весь код, связанный с лексическим анализом, должен располагаться в отдельной модуле программы
- Лексер следует писать без генераторов лексических анализаторов (таких как GNU Flex, lexertl и так далее)
- Лексер должен загружать файл в память и обрабатывать посимвольно, при этом:
- следует хранить исходный текст и позицию чтения (целое число)
- допускается предпросмотр на сколько угодно символов вперёд и сдвиг позиции чтения вперёд (увеличение позиции чтения)
- возврат назад (уменьшение позиции чтения) не допускается
Можно ориентироваться на Пример MemSql
- Список тестов:
tests/SqlLexer.UnitTests/TESTLIST.md - Тесты:
tests/SqlLexer.UnitTests - Реализация:
src/SqlLexer