我正在用 C++ 构建一个代码解释器,虽然我的整个 token 逻辑都在工作,但我遇到了一个意想不到的问题。
用户在控制台输入一个字符串,程序将这个字符串解析为不同的对象类型Token,问题是我这样做的方式如下:
void splitLine(string aLine) {
stringstream ss(aLine);
string stringToken, outp;
char delim = ' ';
// Break input string aLine into tokens and store them in rTokenBag
while (getline(ss, stringToken, delim)) {
// assing value of stringToken parsed to t, this labes invalid tokens
Token t (readToken(stringToken));
R_Tokens.push_back(t);
}
}
这里的问题是,如果解析器接收到一个字符串,例如 Hello World!
,它会将其拆分为 2 个标记 Hello
和 World!
代码的主要目标是将双引号识别为字符串 token 的开头并将其整个存储(从 "
到 "
)作为单个 token 。
因此,如果我输入 x = "hello world"
,它会将 x
存储为标记,然后接下来运行 =
作为标记,然后hello world
作为标记而不是拆分它
最佳答案
您可以使用 C++14 quoted操纵器。
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>
void splitLine(std::string aLine) {
std::istringstream iss(aLine);
std::string stringToken;
// Break input string aLine into tokens and store them in rTokenBag
while(iss >> std::quoted(stringToken)) {
std::cout << stringToken << "\n";
}
}
int main() {
splitLine("Heloo world \"single token\" new tokens");
}
关于c++ - 解释器开发期间解析 token 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390024/