Задание 2.2D

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

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

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

  1. Выполните задание 2.1D
  2. После этого реализуйте вспомогательный метод, реализующий подсчёт и вывод статистики лексем в указанном файле
    • Добавьте в модуль лексического анализа класс LexicalStats
    • Добавьте в этот класс статический метод string CollectFromFile(string path)
  3. Покройте этот метод модульным тестами
    • Тесты должны считать статистику для 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”

Требования к реализации #

  1. Реализация LexicalStats.CollectFromFile читает файл, передаёт исходный код лексическому анализатору и читает токен за токеном, накапливая число лексем в разрезе по категориям.
  2. Тесты должны создавать временный файл и записывать в него пример программы на вашем будущем языке программирования, а затем сверять результат с ожиданием.
  3. Порядок вывода категорий лексем в результирующей строке должен быть определённым. Другими словами, порядок сохраняется при повторном запуске на тех же входных данных.