我正在开发一个实现小语言的C ++项目。事实上,主要包括一种"伪指令"我使用预处理器将它们转换为有效的C ++代码。这个项目是一个课程的作业,主要的代码必须是那种格式。
这是main.cpp中的一部分:
PROGRAM_START
REGEX(name): START TEXT(a) TEXT(b) END //TEXT(a) TEXT(b) gives the string "ab"
.
.
//more regex definitions here
.
.
PROGRAM_END
在.h文件中我有:
std::map<std::string, std::regex> regex_map;
std::string regex_name;
#define PROGRAM_BEGIN int main(){
#define PROGRAM_END return 0;}
#define REGEX(name) \
std::regex name; \
regex_map[#name] = name; \ //exception here
(1) ? (regex_name = #name) \
#define START (regex_name = ""); \
#define END \ regex_map.find(regex_name)->second.assign(currStr,std::regex::ECMAScript); \
#define TEXT(a) getRegex(#a);
...
我想创建一个包含正则表达式的地图和表示正则表达式名称的字符串,但是在我们到达END
之前,字符串将是正则表达式的值。
所以我想在地图中插入一对,在REGEX(name)
宏上使用空正则表达式,然后在END
宏上,使用正则表达式的名称在地图上找到该对,我想将字符串分配给正则表达式。
但即使项目建立得很好,在我上面显示的那条线上我得到了一个例外:
(项目名称)中的0x0097171F处的未处理异常.exe:0xC0000005: 访问冲突读取位置0x00000000。
知道为什么会这样,以及如何实现我想做的事情?
注意: getRegex(#a)
在这种情况下并不重要。创建我所创建的某个类的实例,并为字符串currStr赋值。
注2:使用三元运算符只是为了支持&#34;:&#34;主角中的人物。