出于好奇,我正在编写一个编程语言文本解析器。假设我想将令牌的不可变(在运行时)图定义为顶点/节点。这些自然是不同的类型——一些标记是关键字,一些是标识符,等等。但是它们都有一个共同的特征,即图中的每个标记都指向另一个标记。该属性让解析器知道特定标记后面可能会出现什么 - 因此该图定义了语言的形式语法。我的问题是几年前我不再每天使用 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 解决方案感到满意。非常感谢您提前。