Я написал такой парсер с некоторыми базовыми приемами, такими как Infix -> RPN и Shunting Yard и Обходы деревьев . Вот реализация, которую я придумал .
Он написан на C ++ и компилируется как в Linux, так и в Windows.
Любые предложения / вопросы приветствуются.
Итак, давайте попробуем решить проблему всеми тремя способами. Как перейти от арифметического выражения (например, в строке), такого как "2 + (2)", к дереву выражений с использованием каскадных if, таблицы указателей на функции и / или полиморфизма?
Это интересно, но я не думаю, что это относится к области объектно-ориентированного программирования ... Я думаю, что это больше связано с методами синтаксического анализа .
К сожалению, это не сработает для fatal / parse / etc. ошибки ...
Точно не помню, но я пробовал это и в некоторых случаях получал сообщение типа «не могу сгенерировать исключение без обходного пути ...», но я не могу вспомнить условия, чтобы получить это результат. Но сейчас пользуюсь этим способом и полностью доволен.
Используйте исключения для вещей, которые действительно находятся вне вашего контроля.
Хорошо:
try {
if (fopen('file.txt', 'w') === false) {
throw new Exception('File could not be opened for write access.');
}
} catch (Exception $e) {
echo $e->getMessage();
}
Плохо:
try {
if (strlen($_POST['username']) < 5) {
throw new Exception('Username too short');
}
} catch (Exception $e) {
echo $e->getMessage();
}
Первый способ хорош, потому что это происходит, когда это что-то, что пользователь или приложение не может контролировать. Он не может открыть файл, потому что? может быть много причин.
Второй способ - чрезмерное использование try / catch, когда вам следует использовать trigger_error. Второй способ заключается в том, что пользователь не знает правил проверки имени пользователя.
Короче говоря, используйте исключения, когда вы не можете контролировать то, что вы тестируете. Помните, что у исключений больше накладных расходов, чем у trigger_error :)