-3
我們需要解析出給定的程序代碼。代碼示例:C++程序解析器
procedure example1 {
x = 0;
z = y + x;
a =1;
while a{
x = z + x;
while x {
c = a + b;
}
}
}
我曾嘗試: 的示例代碼是在一個文本文件,所以我打開它,然後我通過信息的載體,在這之後,我從矢量標記逐個分析並尋找關鍵字。目前,我的代碼一直在Error方法中顯示錯誤消息,我看不出明白爲什麼。這是一個學校作業。我的代碼如下。任何和所有的幫助表示讚賞。
vector<string> tokens;
SimpleParser::SimpleParser()
{
cout << "Please enter a file name: ";
cin >> userInput;
cout << "fILENAME: " + userInput;
openFile(userInput);
}
SimpleParser::~SimpleParser()
{
}
void SimpleParser::openFile(string fileName) {
ifstream myfile(fileName);
if (myfile.is_open())
{
while (getline(myfile, currLine))
{
size_t comments = currLine.find("//");
if (comments != string::npos)
{
currLine = currLine.erase(comments);
allLines += " " + currLine;
}
else {
allLines += " " + currLine;
}
}
myfile.close();
fillVector(allLines);
}
else
{
cout << "Unable to open file";
}
}
//check if line is proc, while,assign
void SimpleParser::fillVector(string line) {
istringstream iss(line);
copy(istream_iterator<string>(iss),
istream_iterator<string>(),
back_inserter(tokens));
next_token = getToken();
procedure();
}
void SimpleParser::procedure() {
Match("procedure");
//string proc_name = next_token;
//Match(proc_name);
Match("{");
stmtLst();
Match("}");
}
void SimpleParser::stmtLst() {
cout << "All lines : "+ allLines;
}
void SimpleParser::Match(string token) {
if (next_token.compare(token) == 0) {
next_token = getToken();
}
else {
Error();
}
}
string SimpleParser::getToken() {
string t = "";
if (countOfVecs < tokens.size()) {
t = tokens[countOfVecs];
}
countOfVecs++;
return t;
}
void SimpleParser::Error() {
cout << "Error parsing!";
//exit(0);
}
void SimpleParser::Stmt() {
string var_name = next_token;
Match(var_name);
Match("=");
Match(next_token);
}
所以,你想我在你的代碼中使用調試器來找出是什麼導致了錯誤?對不起,但是在你自己的代碼中使用調試器會更有效率。 –
有意思的是,你發佈不相關的函數,但不要發佈非常相關的類定義。 –
我發現如果'nextToken'與傳遞給'Match'函數的令牌不匹配,就會執行'Error'。如果只有我有一個調試器方便,我可以在'Match'的'if'語句中放置一個斷點,並查看變量'next_token'和'token'來了解它們爲什麼不同。由於我沒有全部代碼,因此無法爲您運行調試器。 –