2011-03-24 61 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