문법이 주어진 재귀 프로그램을 구현할 것입니다. 나는 재귀의 개념을 이해하지만 그것을 구현하는 것은 압도적 일 수있다.문법 주어진 재귀
괄호가있는 문자열에 문제가 있습니다.
"(b-c)"를 입력하면 유효한 표현이되어야하지만 출력에 유효하지 않습니다.
나는 괄호를 다루는 프로그램을 추적 해 왔지만, 나는 틀린 곳을 알아내는 것처럼 보일 수있다.
또한 프로그램이 완벽하지 않을 수도 있지만이 문제를 해결하고 싶습니다. 어떤 도움을 주셔서 감사합니다.
입력하면 사용자에게 입력하라는 메시지가 나타납니다. 나는 필요한 것만 제공했다. 따라야 할
홈페이지
if(i.findExpression(str)){
cout << str << " is legal infix expression.\n";
}
else{
cout << str << " is not a legal infix expression.\n";
}
문법은 다음과 같습니다
표현 = 용어 | 용어 + 용어 | 용어 - 용어
term = factor | factor * factor | 인자/인자
인자 = 문자 | (식)
문자 = A | B | ... | Z
찾기 식
bool infix::findExpression(string strExp){
int i;
int n = (int)strExp.length();
bool found = true;
for (i = 0; i < n; i++){
if((strExp.at(i) == '(') and (n != i)){ //
while((strExp.at(i)!=')') and (n != i)){ //
i++;
}
found = false;
}
else if((strExp.at(i) == '+' or strExp.at(i) == '-') and
(n != i))
{
found = true;
break;
}
else
found = false;
}// added
if(found){
return(findTerm(strExp.substr(0,i))&&findTerm(strExp.substr(i+1, n-(i+1))));
}
else{
return findTerm(strExp.substr(0,n));
}
}
찾기 용어
bool infix::findTerm(string strExp){
int n = (int)strExp.length();
bool found = true;
int i;
for(i = 0; i < n; i++){
if((strExp.at(i) == '(')and (n != i)){
while((strExp.at(i)!=')')and (n != i)){
i++;
}
found = false;
}
else if((strExp.at(i)=='*' or strExp.at(i)=='/')and (n != i)){
found = true;
break;
}
else
found = false;
}
if(found){
return(findFactor(strExp.substr(0,i)) && findFactor(strExp.substr(i+1, n-(i+1))));
}
else{
return findFactor(strExp.substr(0,n));
}
}
찾기 인자
bool infix::findFactor(string strExp)
int i;
char ch;
int n = (int)strExp.length();
bool found = true;
ch = strExp.at(0);
if((n==1)&&islower(ch)){
return true;
}
else if(ch == '('){
for(i = n; i > 0; i--){
if((n-1 != i) and (strExp.at(i-1) == ')')){
found = true;
break;
}
else{
found = false;
}
}
if(found){
return findExpression(strExp.substr(1, i-1));
}
else{return false;}
}
else{return false;}
}
이 모든 것을 스크랩하고 재귀 적 파생 구문 분석기에 대해 읽어야합니다. 그런 파서에는'findAnything'을위한 장소가 없습니다. –
문법을 따르십시오. 문법을 보면, 표현이나 용어에는 괄호가 없습니다. 요인에는 괄호 만 있습니다. (상태를 추가하면 문자열의 현재 위치 또는 나머지 부분을 더 쉽게 얻을 수 있습니다. 반환 할 때 인자가'(', 구문 분석 및')'을 '다음'위치에서 찾을 것으로 예상되면 .그렇지 않으면 유효하지 않습니다.) – molbdnilo
왜 문법이 모호 할 수 있으며, 왜 * 문법이 모호한 지, 어떻게 다루는 지 이해해야합니다. 이것은 하나의 SO 질문 자료가 아닙니다. –