Задание 2.1D

Лабораторная №2 — задание 2.1D #

Нужно написать и покрыть тестами модуль лексического анализа.

⚠️ Обратите внимание #

Это задание выполняется по спецификации, подготовленной аналитиком.

  • Спецификация должна появиться до начала кодирования — так же, как и в реальных проектах.
  • Вы можете составлять спецификацию совместно с аналитиком, а затем приступить к реализации.
  • Ждать проверки спецификации преподавателем не нужно.

Порядок выполнения #

  1. Получите спецификацию лексики языка у своего аналитика
  2. Создайте пустой проект реализации: dotnet new classlib -o src/Lexer
    • добавьте его в решение: dotnet sln add src/Lexer
  3. Создайте пустой проект тестов: dotnet new xunit -o tests/Lexer.UnitTests
    • добавьте его в решение: dotnet sln add tests/Lexer.UnitTests
    • добавьте ссылку на библиотеку из проекта тестов: dotnet add tests/Lexer.UnitTests reference src/Lexer
  4. Создайте список тестов tests/Lexer.UnitTests/TESTLIST.md
  5. Заполните список тестов всеми сценариями, которые вы можете придумать по спецификации
  6. Повторяйте цикл 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#

  1. Лексер должен реализовать спецификацию, описанную аналитиком в файле docs/specification/lexical-structure.md в вашем репозитории
  2. Лексер должен быть разработан по TDD с применением шаблона «Список тестов»
    • список тестов должен быть в формате markdown, описанном ниже
    • при сдаче работы нужно будет показать этот список тестов
    • тестировать следует именно лексер, а не его компоненты
    • не нужно добавлять тривиальные тесты (тесты конструкторов и тому подобное)
  3. Весь код, связанный с лексическим анализом, должен располагаться в отдельной модуле программы
  4. Лексер следует писать без генераторов лексических анализаторов (таких как GNU Flex, lexertl и так далее)
  5. Лексер должен загружать файл в память и обрабатывать посимвольно, при этом:
    • следует хранить исходный текст и позицию чтения (целое число)
    • допускается предпросмотр на сколько угодно символов вперёд и сдвиг позиции чтения вперёд (увеличение позиции чтения)
    • возврат назад (уменьшение позиции чтения) не допускается

Можно ориентироваться на Пример MemSql

  • Список тестов: tests/SqlLexer.UnitTests/TESTLIST.md
  • Тесты: tests/SqlLexer.UnitTests
  • Реализация: src/SqlLexer