Лабораторная №2 — задание 2.2D #
Нужно написать и покрыть тестами утилитарный метод, использующий возможности лексического анализа.
Порядок выполнения #
- Выполните задание 2.1D
- После этого реализуйте вспомогательный метод, реализующий подсчёт и вывод статистики лексем в указанном файле
- Добавьте в модуль лексического анализа класс
LexicalStats - Добавьте в этот класс статический метод
string CollectFromFile(string path)
- Добавьте в модуль лексического анализа класс
- Покройте этот метод модульным тестами
- Тесты должны считать статистику для 1-2 реалистичных программ, написанных на вашем будущем языке программирования
Требования к подсчёту статистики лексем #
Требования показаны на примере лексического анализа Pascal.
Пример входного файла:
PROGRAM SumTwoNumbers;
VAR
num1, num2, sum: INTEGER;
BEGIN
WRITELN('Enter the first number: ');
READLN(num1);
WRITELN('Enter the second number: ');
READLN(num2);
sum := num1 + num2;
WRITELN('The sum of ', num1, ' and ', num2, ' is: ', sum)
END.
Пример строки, генерируемой методом LexicalStats.CollectFromFile:
keywords: 4
identifier: 18
number literals: 0
string literals: 5
operators: 2
other lexemes: 25
Объяснение:
- Метод считает категории токенов
- Все ключевые слова попадают в категорию “keywords”
- Все операторы попадают в категорию “operators”
- Все лексемы, не попадающие в иные категории, попадают в категорию “other lexemes”
Требования к реализации #
- Реализация
LexicalStats.CollectFromFileчитает файл, передаёт исходный код лексическому анализатору и читает токен за токеном, накапливая число лексем в разрезе по категориям. - Тесты должны создавать временный файл и записывать в него пример программы на вашем будущем языке программирования, а затем сверять результат с ожиданием.
- Порядок вывода категорий лексем в результирующей строке должен быть определённым. Другими словами, порядок сохраняется при повторном запуске на тех же входных данных.