所以我有这个递归下降解析器,它可以很好地通过命令行参数识别和使用值,但我不确定如何将其移植到从 .dat 文件中读取,使用正确的字符指针,打印字符串,然后工作对于多个字符串。
使用命令行参数的解析器:
#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)
当我尝试这样做时,我遇到了段错误。
最佳答案
您要求流将值存储到 c
指向的值所表示的内容中。取而代之的是:
char ch;
char *c = &ch;
ifstream fin("input.dat");
while (fin >> ch) {
// whatever
}
这不会立即出现段错误。但是,当您在解析函数中更改 c
的值时,“下一次”迭代会发生不好的事情。
您需要重构程序并从读取下一个字符的方法(通过递增指针,或从流,或其他)。
或者您也可以将文件读入一个大的内存缓冲区,然后将该缓冲区视为从命令行传递的字符串。
关于c++ - 通过 ifstream 的 Char 指针和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5413964/