2016-09-10 4 views
0

Я пытаюсь перевести кодовую базу для моего языка программирования из Lua в C++. Я только что начал. Я не эксперт на C++, и я надеюсь, что смогу узнать больше , пока написал его, но я уже столкнулся с препятствием, которое заставило меня остановиться.Возвращение совершенно разных типов данных из функции

Теперь я пишу модуль лексического анализатора. Предполагается, что он возвращает дважды связанный список токенов, но, конечно, ошибка может возникать при анализе исходного кода, например. когда многострочный комментарий или строка не имеет конечной скобки и тому подобного.

Я мог бы, конечно, когда я столкнулся с ошибкой, распечатал сообщение и просто закончил программу. Но поскольку я хочу сделать эти ошибки доступными, самая легкая вещь, о которой я могу думать, - это вернуть эти ошибки, так что если функция обработки ошибок получит эту ошибку, она может ее обработать, но если она получит все путь вниз к интерпретатору, его сообщение затем печатается.

В Lua это было легко. Я мог бы заставить функцию возвращать либо дважды связанный список токенов (я использовал массивы без массивов, но это неважно), если функция лексического анализатора не обнаружила ошибок в переданном тексте или объект ошибки, обрабатываемый вызывающим.

Поскольку C++ должен указывать тип возврата, однако, как я могу заставить функцию возвращать объект ошибки, если это необходимо, чтобы можно было корректно обрабатывать? Или я должен изменить подход и использовать что-то другое, чем система возврата?

К сожалению, я не могу найти огромную базу данных языков, таких как Python, чтобы посмотреть, как они справляются с этой ситуацией, поэтому даже ссылка на эти файлы может помочь.

+0

Наследование - базовый класс «Ошибка» несет сообщение и местоположение - часть консоли/протоколирования должна соответствовать этому.Из 'Error' выведите свои конкретные классы для переноса информации, требуемой вашим« кодом восстановления », чтобы выполнить свою работу. Ах, и верните эти ошибки как 'std :: shared_ptr'. Для фактического возврата вашего списка токенов верните их в параметр функции (указатель/ссылка) –

ответ

2

Если это просто обработка ошибок, возможно, вы захотите использовать exceptions, потому что это стандартный механизм обработки ошибок в C++. Конечно, вам придется ловить и обрабатывать эти исключения где-то, потому что в противном случае программа C++ перестает работать.

Если вам действительно нужен способ получить несколько возможных типов возврата из одной функции, вы можете попробовать unions. Этот подход имеет тот недостаток, что вам нужен способ указать вызывающей вас функции, тип которой вы фактически вернули, и вызывающему нужно проверить различные возможности.

Кроме того, я могу дать вам общий совет: хотя я не знаю вашей мотивации для перевода кода из Lua на C++, я бы не советовал делать это только ради того, чтобы иметь доступ ко всему этому коду в C++, если код Lua работает для вашей цели. Скорее всего, вы столкнетесь с такими ситуациями, когда вы не сможете адекватно перевести языковые функции из Lua в C++.

Вместо этого вы можете попытаться использовать Lua непосредственно из C++ с помощью обертки, такой как Lua API++ library, если вам нужен способ взаимодействия с Lua из приложения C++.

+0

Вы имеете в виду исключения C++ для моих языковых исключений? Это выглядит здоровым, и я, конечно, не думал об этом. Что касается Lua на C++, это для переносимости, производительности и даже потому, что я не могу найти источник некоторых ошибок с динамикой Lua. – user6245072

+0

Кроме этого, я не совсем понимаю, что вы имеете в виду с частью профсоюзов. Как можно использовать их? – user6245072

+0

Да, я имею в виду исключения C++. Что касается переносимости: Lua - интерпретируемый язык и, по моему мнению, довольно переносимый, но ваш уровень может отличаться. Производительность может быть связана с проблемой Lua, но, как всегда, с производительностью: эталоном/измерьте ее. Иногда вы можете получить результаты, которых не ожидали. И я только что добавил строку о библиотеке Lua API ++, оболочке вокруг Lua для C++. Также могут быть другие типы языковых привязок между Lua и C++, которые позволяют вам (повторно) использовать Lua из C++. Возможно, стоит проверить. – Striezel

1

Попросите лексический анализатор вернуть объект, который инкапсулирует результат и флаг для указания успеха или отказа, например.

struct Result { 
    bool isValid; //flag to indicate of the result is valid 

    //result from the analyzer 
    std::list<int> list; 
}; 

Затем в лексическом анализаторе установлен флаг соответствующим образом, например. когда выбрано исключение, значение isValid равно false.

+0

Я уже так об этом разбираюсь. Я должен подробно рассказать о структуре, чтобы нести сообщение и другую информацию, так или иначе это лучше, чем то, что предложил Стризел (я имею в виду исключения C++)? – user6245072

+0

Больше ООП. Использование структуры (или класса) с флагом (и, возможно, сообщение или даже исключение) вместе с фактическими данными сделает для пользователя функции (DoWork) то, как интерпретировать смысл результата. Это позволит клиентам решить, как обрабатывать случай, когда isValid является ложным. В качестве альтернативы вы можете просто выбросить исключение и заставить клиентов обрабатывать это исключение. – robor78