Лабораторная №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)
Формат списка тестов #
Список тестов должен находится в модуле лексического анализа и называется TESTLIST.md
- Тесты описываются кратко в формате TODO-списка:
- [ ] ваш текст - Пройденные тесты обозначаются латинской буквой “x”:
- [x] ваш текст
Пример заполнения:
# Список тестов
## Класс Lexer
- [x] Разбор SELECT без FROM: `SELECT 2025;`
- [x] Разбор FROM: `SELECT first_name FROM student;`
- [ ] Поддержка множественных полей: `SELECT first_name, last_name, email FROM student;`
- [ ] Определение ключевых слов без учёта регистра: `select first_name, last_name FrOM student;`
- [ ] Оператор сложения: `SELECT count + 1 FROM counter;`
Требования к лексеру (лексическому анализатору) #
Учитывайте Требования к коду на C#
- Лексер должен реализовать спецификацию, описанную аналитиком в файле
docs/specification/lexical-structure.mdв вашем репозитории - Лексер должен быть разработан по TDD с применением шаблона «Список тестов»
- список тестов должен быть в формате markdown, описанном ниже
- при сдаче работы нужно будет показать этот список тестов
- тестировать следует именно лексер, а не его компоненты
- не нужно добавлять тривиальные тесты (тесты конструкторов и тому подобное)
- Весь код, связанный с лексическим анализом, должен располагаться в отдельной модуле программы
- Лексер следует писать без генераторов лексических анализаторов (таких как GNU Flex, lexertl и так далее)
- Лексер должен загружать файл в память и обрабатывать посимвольно, при этом:
- следует хранить исходный текст и позицию чтения (целое число)
- допускается предпросмотр на сколько угодно символов вперёд и сдвиг позиции чтения вперёд (увеличение позиции чтения)
- возврат назад (уменьшение позиции чтения) не допускается
Можно ориентироваться на Пример MemSql
- Список тестов:
tests/SqlLexer.UnitTests/TESTLIST.md - Тесты:
tests/SqlLexer.UnitTests - Реализация:
src/SqlLexer