好奇心から、プログラミング言語のテキストパーサーを書いています。トークンの不変 (実行時) グラフを頂点/ノードとして定義したいとします。これらは当然、タイプが異なります。一部のトークンはキーワードであり、一部は識別子などです。ただし、それらはすべて、グラフ内の各トークンが別のトークンを指すという共通の特性を共有しています。このプロパティにより、パーサーは特定のトークンの後に何が続くかを知ることができます。したがって、グラフは言語の正式な文法を定義します。私の問題は、数年前に 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 ソリューションにも満足できます。事前にどうもありがとうございました。