Punctuator
类,我想用它来表示令牌中输入源文件中的标点符号,此外,它将是一些用于扫描的静态辅助方法的所在地。这是标点符号.h:
#ifndef PUNCTUATOR_H_
#define PUNCTUATOR_H_
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include "reserved_component.h"
enum class PunctuatorEnum {
OPEN_BRACE,
CLOSE_BRACE,
TERMINATOR,
EQUAL,
PLUS,
MINUS,
MULTIPLY,
DIVIDE,
};
class Punctuator : public ReservedComponent {
public:
Punctuator(std::string lexeme);
Punctuator(Punctuator&& punctuator);
static bool IsPunctuator(std::string buffer);
static PunctuatorEnum ForLexeme(std::string buffer);
private:
PunctuatorEnum punctuator_enum;
static std::unordered_map<std::string, PunctuatorEnum> dictionary;
};
#endif // PUNCTUATOR_H_
如您所见,我使用静态 unordered_map
来存储可能的标点符号的“字典”,然后使用此映射来检查给定的字符串是否表示标点符号。我正在此处初始化 puncttuator.c 文件内的地图:
#include "punctuator.h"
std::unordered_map<std::string, PunctuatorEnum> Punctuator::dictionary = {
{ "{", PunctuatorEnum::OPEN_BRACE },
{ "}", PunctuatorEnum::CLOSE_BRACE },
{ ".", PunctuatorEnum::TERMINATOR },
{ "=", PunctuatorEnum::EQUAL },
{ "+", PunctuatorEnum::PLUS },
{ "-", PunctuatorEnum::MINUS },
{ "*", PunctuatorEnum::MULTIPLY },
{ "/", PunctuatorEnum::DIVIDE }
};
Punctuator::Punctuator(std::string lexeme) : ReservedComponent(lexeme) {
this->punctuator_enum = dictionary.at(lexeme);
}
Punctuator::Punctuator(Punctuator&& punctuator) : ReservedComponent(std::move(punctuator)) {
this->punctuator_enum = std::move(punctuator.punctuator_enum);
}
bool Punctuator::IsPunctuator(std::string buffer) {
return dictionary.contains(buffer);
}
PunctuatorEnum Punctuator::ForLexeme(std::string lexeme) {
return dictionary.at(lexeme);
}
我知道这不是最干净的方法,因为这迫使我维护 PunctuatorEnum
和无序地图,但这是我到目前为止所选择的。我还想实现一个方法
StartsPunctuator(char c)
来检查给定的字符是否启动标点符号。我的问题如下:是否可以在我的
unordered_set
类中声明一个静态
Punctuator
变量,例如
punctuator_first_char
,并将其初始化为仅存储该键集的每个条目的第一个字符静态成员变量
dictionary
?这样我就可以在
contains
方法中简单地调用
punctuator_first_char
上的
StartsPunctuator(char ch)
方法,而无需迭代
dictionary
。
是否可以在我的是的:
static unordered_set
类中声明一个Punctuator
变量,例如punctuator_first_char
,并将其初始化为仅存储静态成员变量dictionary
的键集的每个条目的第一个字符?
#include <unordered_set>
class Punctuator : public ReservedComponent {
//...
private:
PunctuatorEnum punctuator_enum;
static std::unordered_map<std::string, PunctuatorEnum> dictionary;
static std::unordered_set<char> punctuator_first_char;
};
初始化:
#include <algorithm>
#include <iterator>
std::unordered_set<char> Punctuator::punctuator_first_char = [] {
std::unordered_set<char> rv;
std::transform(dictionary.begin(), dictionary.end(),
std::inserter(rv, rv.end()),
[](auto&& str_punctenum) { return str_punctenum.first[0]; });
return rv;
}();