Из любопытства пишу парсер текста на языке программирования. Скажем, я хочу определить неизменный (во время выполнения) граф токенов как вершины / узлы. Это, естественно, разные типы - некоторые токены являются ключевыми словами, некоторые - идентификаторами и т. Д. Однако все они имеют общую черту, где каждый токен в графе указывает на другой. Это свойство позволяет синтаксическому анализатору знать, что может следовать за конкретным токеном, и поэтому граф определяет формальную грамматику языка. Моя проблема в том, что я перестал использовать C ++ ежедневно несколько лет назад и с тех пор использовал много языков более высокого уровня, и моя голова полностью фрагментирована в отношении размещения кучи, размещения стека и тому подобного. Увы, мой C ++ ржавый.
Тем не менее, я хотел бы сразу подняться на крутой холм и поставить перед собой цель определить этот граф на этом императивном языке наиболее эффективным способом. Например, я хочу избежать выделения каждого объекта токена отдельно в куче, используя «new», потому что я думаю, что если я выделю весь график этих токенов, так сказать, в прямом (в линейном виде, как элементы в массиве), это как-то улучшит производительность, согласно принципу локальности ссылок - я имею в виду, когда весь граф сжимается, чтобы занять минимальное пространство вдоль «линии» в памяти, вместо того, чтобы все его объекты-токены располагались в случайных местах, это плюс? В любом случае, как вы видите, это немного открытый вопрос.
class token
{
}
class word: token
{
const char* chars;
word(const char* s): chars(s)
{
}
}
class ident: token
{
/// haven't thought about these details yet
}
template<int N> class composite_token: token
{
token tokens[N];
}
class graph
{
token* p_root_token;
}
Непосредственный вопрос: какова будет процедура создания этого графического объекта? Он неизменен, и его структура мысли известна во время компиляции, поэтому я могу и хочу избегать копирования содержимого по значению и т. Д. - должна ли быть возможность составлять этот граф из литералов? Я надеюсь, что здесь есть смысл ... (это был бы не первый раз, когда я этого не делал). График будет использоваться синтаксическим анализатором во время выполнения как часть компилятора. И только потому, что это C ++, я был бы счастлив и решением на C. Заранее большое спасибо.