如何用 C++ 创建一个可以翻译以下文本的程序:
main(form(text(hello())text1(new)))
在那里面:
main form text hello
main form text1 new
我已经尝试这样做了,但还没有成功:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string code = "main(form(text(hello(world))text1(new)))";
vector<string> real_code;
string token;
for(char k: code)
{
if(k == '(')
{
real_code.push_back(token);
real_code.push_back("(");
token = "";
}else if(k == ')')
{
real_code.push_back(token);
real_code.push_back(")");
token = "";
}else{token += k;}
}
for(string j: real_code)
{
cout << j << " ";
}cout << endl << endl;
vector<string> names;
for(int i = 0; i < 11; i++)
{
string here = real_code[i];
string next = (i < 10)? real_code[i+1] : real_code[i];
cout << "\n=> ";
if(here == ")")
{
for(string j: names)
{
cout << j << " ";
}//cout << endl;
names.pop_back();
} else if(here == "("){
continue;
} else {
if(next == ")")
{
names.push_back(here);
for(string j: names)
{
cout << j << " ";
}
}
if(next == "(")
{
names.push_back(here);
}
}
}
}
(提前对糟糕的代码表示歉意)
您将需要以下标头:向量、可选*、字符串和 iostream。
让我们来一一列举
现在我们有了一个令牌列表,您可以在那里添加您需要的令牌类型,到目前为止我只添加了您现在需要的那些。
让我们有一个代币结构
假设我们有一个将标记转换为字符串的函数。
您现在可以添加或更改文本输出。假设您希望 open_pra 是文本,例如 (,而不是空格。那么您只需将“”替换为“(”
现在让有一个反函数将字符串转换为标记
您还可以随着枚举的增长扩展此功能。
现在最重要的是把代码变成token。分词器函数将负责这一点。
现在我们可以使用此函数将代码包装到令牌向量中。剩下的就是 main 函数了。
可选* - 要使用可选,您需要 C++17 或更高版本。
结论: