从静态 unordered_map 的键创建静态 unordered_set

问题描述 投票:0回答:1
我正在为编译器编写前端,目前正在致力于实现标点符号扫描功能。我有一个

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

c++ compiler-construction lexical-analysis static-variables
1个回答
0
投票
是否可以在我的

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; }();
    
© www.soinside.com 2019 - 2024. All rights reserved.