我正在寻找一些关于我的作业的建议/帮助。因为是上课,所以我并没有要求任何人为我写出答案,但是我的实际编码确实需要帮助。
问题:
到目前为止,我的实际工作是:(我暂时暂时不在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/