|
|
|
Для добавления новых условий необходимо изменить файлы Rules.h и Rules.cpp.
|
|
|
|
|
|
|
|
Необходимо создать класс, унаследовавшись от базового класса Rule.
|
|
|
|
Необходимо переопределить конструктор с параметрами string и size_t, где строка является аргументом получаемым из файла с правилами, а число - номером правила.
|
|
|
|
Также необходимо переопределить метод std::string check(RuleTarget). Этот метод будет заключать в себе логику правила. На вход поступает текущая лексема со всей доступной информацией о ней. На выход необходимо вернуть результат прохождения правила: строка ошибки или пустая строка, в случае успеха.
|
|
|
|
|
|
|
|
Рассмотрим пример:
|
|
|
|
Создадим правило проверяющее количество пробелов после лексемы. Для этого в файле Rules.h создаем класс
|
|
|
|
```
|
|
|
|
class RuleSpacesAfter : public Rule {
|
|
|
|
std::string spaces_count;
|
|
|
|
size_t rule_num;
|
|
|
|
public:
|
|
|
|
RuleSpacesAfter(std::string spaces_count, size_t num) : spaces_count(spaces_count), rule_num(num) {};
|
|
|
|
|
|
|
|
std::string check(RuleTarget target);
|
|
|
|
};
|
|
|
|
```
|
|
|
|
|
|
|
|
В файле Rules.cpp определяем функцию check
|
|
|
|
```
|
|
|
|
string RuleSpacesAfter::check(RuleTarget target)
|
|
|
|
{
|
|
|
|
if (to_string(target.lexema.spaces_after()) != spaces_count)
|
|
|
|
return "Incorrect spaces count after lexema (" + to_string(target.lexema.spaces_after()) +
|
|
|
|
", but expected " + spaces_count + ')';
|
|
|
|
else
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
``` |
|
|
|
\ No newline at end of file |