gpt4 book ai didi

c++ - 在 C++ 中用于初始化二维数组的 C 嵌套数组指示符的最佳替代方法是什么?

转载 作者:行者123 更新时间:2023-12-05 03:37:02 25 4
gpt4 key购买 nike

我目前正在尝试将我的小型正则表达式引擎从 C 转换为 C++。为了以一种紧凑的方式丢弃语法上不正确的正则表达式,我使用一个二维数组来定义允许哪些类型的标记相继出现:

#define NUMBER_OF_TOKEN_KINDS 15
typedef enum {
Literal,
Alternator,
...
} TokenKind;

bool grammar_allowed[NUMBER_OF_TOKEN_KINDS][NUMBER_OF_TOKEN_KINDS] = {
...
[Literal][Alternator] = true,
[Alternator][Literal] = true,
...
}

使用这种结构,您可以通过检查是否设置了 grammar_allowed[previous_token][current_token] 轻松捕获大部分语法错误。

这种初始化 grammar_allowed 的方法在 C++ 中不起作用,因为嵌套数组指示符不是该语言的一部分。我可以想到上述代码的两个可行替代方案,但两者都有缺点:

  1. 只是不要使用指示符来初始化数组中的条目。这大大降低了它的可读性,因为我无法一眼看出哪个条目对应于哪个标记。添加/删除 token 或修复错误的初始化也会很烦人。
private:
static constexpr bool m_grammar_allowed[NUMBER_OF_TOKEN_KINDS][NUMBER_OF_TOKEN_KINDS] = {
{false, true, true, false, false, true, ...},
...
}
  1. 在构造函数中逐行初始化条目。这不会失去可读性但速度较慢,因为数据必须在运行时加载而不是存储在可执行文件本身中。
Lexer() {
...
m_grammar_allowed[Literal][Alternator] = true;
m_grammar_allowed[Alternator][Literal] = true;
...
}

有没有其他方法可以在 C++ 中像这样初始化二维数组,但又不牺牲可读性或性能?

谢谢!

最佳答案

您可以创建一个 constexpr 函数来初始化您的 std::array(而不是 C 数组):

constexpr
std::array<std::array<bool, NUMBER_OF_TOKEN_KINDS>, NUMBER_OF_TOKEN_KINDS>
make_grammar_allowed()
{
std::array<std::array<bool, NUMBER_OF_TOKEN_KINDS>, NUMBER_OF_TOKEN_KINDS> res {};

res[Literal][Alternator] = true;
res[Alternator][Literal] = true;
// ...
return res;
}

static constexpr
std::array<std::array<bool, NUMBER_OF_TOKEN_KINDS>, NUMBER_OF_TOKEN_KINDS>
m_grammar_allowed = make_grammar_allowed();

关于c++ - 在 C++ 中用于初始化二维数组的 C 嵌套数组指示符的最佳替代方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69468027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com