所以我试图从一个输入文件生成一个符号表,该文件包含 C++ 中这样的 C 样式嵌套块;
A: { int a; float b;
B: { float c; int d;
C: { int b; int c;
}
}
D: { float a;
}
}
输出应如下所示。
A: a -> <int, A>
b -> <float, A>
B: a -> <int, A>
b -> <float, A>
c -> <float, B>
d -> <int, B>
C: a -> <int, A>
b -> <int, C> -> <float, A>
c -> <int C> -> <float, B>
d -> <int, local to B>
D: a -> <float D> -> <int, A>
b -> <float, A>
我已经尝试了很多东西。使用向量、地图,现在我终于决定使用多重地图。无论我做什么,我都会遇到同样的问题,所以它可能与我选择的数据结构无关。
问题是,因为我逐行阅读,我最终会比我需要的更多。但是,如果我没有它在 for 循环中为每一行计算/迭代多图,而不是在它们被擦除/弹出后进行迭代。我不确定如何在逻辑上明智地使输出按原样显示,或者我是否走在正确的轨道上。
到目前为止,这是我的 .cpp 文件。忽略评论,因为它们是我目前选择不使用的过去尝试。同样在这个版本中,我没有使用向量,因此您可以忽略与向量相关的代码。我现在只是在使用多图。
#include<iostream>
#include<fstream>
#include<string>
#include <sstream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
void ReadFromFile();
void main(){
ReadFromFile();
cin.get();
}
void ReadFromFile(){
stringstream ss;
string type = "";
string var = "";
string lable = "";
string Obraket = "";
string Cbraket = "";
int braketCount = -1;
ifstream myfile("input1.txt");
multimap<string, string> symbol;
multimap<string, multimap<string, string>> symbolL;
if (myfile.is_open())
{
for (string line; getline(myfile, line);)
{
istringstream in(line);
if (in.str().find("}") == string::npos && in.str().find("{") != string::npos){
in >> lable;
in >> Obraket;
braketCount++;
cout << Obraket << endl;
in >> type;
in >> var;
symbol.insert(pair<string, string>(var.substr(0, 1), type));
if (in.str().find("float") != string::npos || in.str().find("int") != string::npos){
var = "";
type = "";
in >> type;
in >> var;
if (type.length() > 1){
symbol.insert(pair<string, string>(var.substr(0, 1), type));
}
}
symbolL.insert( pair<string, multimap<string, string>>(lable,symbol));
for (multimap<string, multimap<string, string>>::iterator it = symbolL.begin(); it != symbolL.end(); ++it){
cout << it->first;
for (multimap<string, string>::iterator it2 = symbol.begin(); it2 != symbol.end(); ++it2){
cout << it2->first << "-> " << "<" << it2->second << ">, " << it->first.substr(0, 1) << endl;
}
}
}
else if (in.str().find("}") != string::npos){
in >> Cbraket;
//braketCount--;
cout << Cbraket << endl;
symbolL.erase(prev(symbolL.end()));
//symbol.erase(prev(symbol.end()));
}
}
myfile.close();
}
else cout << "Unable to open file";
}
这是我得到的输出。
{
A:a-> <int>, A
b-> <float>, A
{
A:a-> <int>, A
b-> <float>, A
c-> <float>, A
d-> <int>, A
B:a-> <int>, B
b-> <float>, B
c-> <float>, B
d-> <int>, B
{
A:a-> <int>, A
b-> <float>, A
b-> <int>, A
c-> <float>, A
c-> <int>, A
d-> <int>, A
B:a-> <int>, B
b-> <float>, B
b-> <int>, B
c-> <float>, B
c-> <int>, B
d-> <int>, B
C:a-> <int>, C
b-> <float>, C
b-> <int>, C
c-> <float>, C
c-> <int>, C
d-> <int>, C
}
}
{
A:a-> <int>, A
a-> <float>, A
b-> <float>, A
b-> <int>, A
c-> <float>, A
c-> <int>, A
d-> <int>, A
D:a-> <int>, D
a-> <float>, D
b-> <float>, D
b-> <int>, D
c-> <float>, D
c-> <int>, D
d-> <int>, D
}
}