В качестве упражнения я пишу лексер и синтаксический анализатор для терминального калькулятора. Анализатор определяет тип отдельного символа в строке, представляющей выражение, и присваивает токену некоторое значение типа.
Ниже приведен фрагмент функции, определяющей тип (я это сделал не включать всю функцию или все случаи, чтобы сделать код короче):
Код: Выделить всё
switch(c)
{
case '0': case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9': case '.':
return 'n'; // 'n' for number
case '*': case '/':
return 'm'; // m for multiplication or division
case '(': case ')':
return 'p'; // p for parenthesis
case ' ': // whitespace
return 'w';
default:
throw std::invalid_argument("Invalid token: A non-valid character was passed to determineKind");
}
Но в то же время 'n', 'm', 'p' и 'w' являются магическими константами, что делает код внутри парсера снова менее читабельным.
Есть ли способ использовать операторы переключателя с полными именами, например «число», «пробелы» и «круглые скобки», чтобы все было проще?
Подробнее здесь: https://stackoverflow.com/questions/784 ... readabilty