我正在寻找一些关于我的作业的建议/帮助。因为是上课,所以我并没有要求任何人为我写出答案,但是我的实际编码确实需要帮助。

问题:



到目前为止,我的实际工作是:(我暂时暂时不在txt文件中读取内容,想先让语法开始工作)
edit1:问题在于没有任何一个字符串显示为该语言中的有效字符串。不幸的是,即使像a = b这样的简单字符串也必须经过几乎所有生产规则,因此我无法查明我要去哪里哪里

//A -> I = E
//E -> T + E | T - E | T
//T -> F * T | F / T | F
//F -> P ^ F | P
//P -> I | L | (E)
//I -> a | b | ... | y | z
//L -> 0 | 1 | ... | 8 | 9

#include <iostream>

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;
                if ( E() )
                return true;
        }
    }
    else
    if ( T() ){
        ++c;
        return true;
    }

    return false;
}

bool F(void){

    if( P() ){
        if( *c == '^')
        ++c;
        if( F() )
        return true;
    }
    else
    if ( P() ){
        ++c;
        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() ){
        ++c;
        return true;
    }
    else
    if ( L() ){
        ++c;
        return true;
    }
    else
    if ( *c == '(' ){
            ++c;
            if ( E() ){
                    if ( *c == ')' ){
                        ++c;
                        return true;
                    }
            }
    }

    return false;
}

bool T(void){

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

    return false;
}

最佳答案

我认为您在检测类似问题时遇到了一般性问题

E = T + E | T - E | T

当您寻找T()而失败时,您尝试再次寻找T()
您在其他大多数功能中也犯了这个错误。
E()的正确实现将是(Chris评论后更新):
if (T())
{
   if (c == '+' || c == '-')
   {
      ++c;
      return E();
   }
   return true;
}
return false;

让我们举个例子:“a =(3)”
A()-> I()返回true-> c == '='-> E()-> T()在调用3后解析P()时返回true,最终再次调用E()->现在是c == ')',因此我们需要在E()中返回true,否则,如果我们在此处返回false,解析将停止在P()

我希望它不会太困惑,但是在这里很难表达。最好的办法是将解析树记录在一张纸上以使其可视化。

再次更新:T()F()中的情况类似

关于java - 递归下降解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5411897/

10-14 11:37
查看更多