2011-03-24 33 views
1

所以我有這個遞歸下降解析器工作正常,通過命令行參數識別和使用值,但我不知道如何將此端口從.dat文件讀取,使用正確的字符指針,打印字符串,併爲多個字符串工作。通過ifstream的字符指針和字符串

使用分析器命令行參數:

#include <iostream> 
#include <fstream> 

using namespace std; 

bool A(void); 
bool E(void); 
bool T(void); 
bool F(void); 
bool P(void); 
bool I(void); 
bool L(void); 

char *c; 

int main(int argc, char *argv[]){ 

    c = argc == 2 ? argv[1] : (char *)""; 

    if (A() && *c == '\0') { 
     cout << "The string \"" << argv[1] << "\" is in the language." << endl; 
    } 
    else { 
     cout << "The string \"" << argv[1] << "\" is not in the language." << endl; 
    } 

    return 0; 
} 

bool A(void){ 

    if(I()) 
    { 
     if (*c == '='){ 
      ++c; 
      if (E()) 
      return true; 
     } 
    } 
    return false; 
} 

bool E(void){ 

    if(T()){ 
     if (*c == '+' || *c == '-'){ 
       ++c; 
       return E(); 
     } 
     return true; 
    } 
    return false; 
} 

bool F(void){ 

    if(P()){ 
     if(*c == '^'){ 
      ++c; 
      return F(); 
     } 
    return true; 
    } 
    return false; 
} 

bool I(void){ 

    if (*c >= 'a' && *c <= 'z'){ 
     ++c; 
     return true; 
    } 
    return false; 
} 

bool L(void){ 

    if (*c >= '0' && *c <= '9'){ 
     ++c; 
     return true; 
    } 
    return false; 
} 

bool P(void){ 

    if (I()){ 
     return true; 
    } 
    else 
    if (L()){ 
     return true; 
    } 
    else 
    if (*c == '('){ 
      ++c; 
      if (E()){ 
        if (*c == ')'){ 
         ++c; 
         return true; 
        } 
      } 
    } 
    return false; 
} 

bool T(void){ 

    if(F()){ 
     if (*c == '*' || *c == '/'){ 
       ++c; 
       return T(); 
     } 
     return true; 
    } 
    return false; 
} 

我不知道我可以代替的argv [1]打印字符串。 爲了得到正確的字符指針,我可以這樣做嗎?

ifstream fin("input.dat"); 
     while (fin >> *c) 

當我嘗試我得到分段錯誤。

+3

你確實需要學習使用豐富的函數名稱。 – GWW 2011-03-24 02:08:41

+0

它們是完全任意的名字,看它的語法如何,除了這個練習之外,不會使用任何其他的語法。 – 2011-03-24 02:13:17

+0

爲什麼要使用指針,您正在使用全局變量。 – 2011-03-24 02:17:33

回答

0

您正在要求數據流將值存儲到由c指向的值所表示的值中。取而代之的是,考慮:

char ch; 
char *c = &ch; 

ifstream fin("input.dat"); 
while (fin >> ch) { 
    // whatever 
} 

這不會馬上發生段錯誤。但是,在「下一個」迭代中會發生不好的事情,因爲您在解析函數中更改了c的值。

需要(通過遞增一個指針,或從流,或任何讀取)重組程序和抽象的讀取來自讀取下一個字符的方法的下一個字符的意圖

或者您也可以將文件讀入一個大的內存緩衝區,然後繼續進行,就好像該緩衝區是從命令行傳遞的字符串一樣。

0

假設你的文件是一個條目的文本文件中每行解析你可以這樣做:

ifstream fin("input.dat") 
if (fin.is_open()) 
{ 
    std::string line; 
    while (fin.good()) 
    { 
     getline(fin, line); 
     c = line.c_str(); 
     ... go and parse c 
    } 
} 

更新:顯然c是非常量,因此使用c_str()將無法​​正常工作,就像那。你有兩個選擇:

  1. 更改您的解析器性病工作::字符串(使用索引在當前字符點)。
  2. 分配一些內存並在那裏複製c_str()

數字1可能是更好的方法。

+0

無效的const char到char?我從「c = line.c_str();」 – 2011-03-24 02:46:55