C++实现9+5*2/3-6递归下降语法分析器,输出按照推导过程输出,要求有完整输出程序
时间: 2024-02-01 19:16:16 浏览: 73
以下是实现9+5*2/3-6递归下降语法分析器的完整程序:
```cpp
#include <iostream>
#include <string>
using namespace std;
int pos = 0;
string input;
double parseExpr();
double parseTerm();
double parseFactor();
double parseNumber();
int main() {
cout << "输入表达式: ";
getline(cin, input);
double result = parseExpr();
if (pos != input.length()) {
cout << "语法错误" << endl;
return 1;
}
cout << "结果:" << result << endl;
return 0;
}
double parseExpr() {
double left = parseTerm();
while (pos < input.length()) {
char op = input[pos];
if (op != '+' && op != '-') {
break;
}
pos++;
double right = parseTerm();
if (op == '+') {
cout << left << " + " << right << endl;
left += right;
} else {
cout << left << " - " << right << endl;
left -= right;
}
}
return left;
}
double parseTerm() {
double left = parseFactor();
while (pos < input.length()) {
char op = input[pos];
if (op != '*' && op != '/') {
break;
}
pos++;
double right = parseFactor();
if (op == '*') {
cout << left << " * " << right << endl;
left *= right;
} else {
cout << left << " / " << right << endl;
left /= right;
}
}
return left;
}
double parseFactor() {
if (pos >= input.length()) {
cout << "语法错误" << endl;
exit(1);
}
char c = input[pos];
if (c == '(') {
pos++;
double result = parseExpr();
if (input[pos] != ')') {
cout << "语法错误" << endl;
exit(1);
}
pos++;
return result;
} else if (isdigit(c)) {
return parseNumber();
} else if (c == '+' || c == '-') {
pos++;
double result = parseFactor();
if (c == '-') {
cout << c << result << endl;
result = -result;
}
return result;
} else {
cout << "语法错误" << endl;
exit(1);
}
}
double parseNumber() {
double result = 0;
while (pos < input.length() && isdigit(input[pos])) {
result = result * 10 + (input[pos] - '0');
pos++;
}
if (pos < input.length() && input[pos] == '.') {
pos++;
double fraction = 1;
while (pos < input.length() && isdigit(input[pos])) {
fraction /= 10;
result += fraction * (input[pos] - '0');
pos++;
}
}
return result;
}
```
程序采用递归下降的方法来实现语法分析,每个非终结符对应一个函数,函数根据语法规则递归调用其他函数来实现语法分析。具体来说,`parseExpr()`函数对应表达式的语法规则,`parseTerm()`函数对应项的语法规则,`parseFactor()`函数对应因子的语法规则,`parseNumber()`函数用于解析数字。在语法分析过程中,程序会输出推导过程,以便于理解语法分析的过程。
在主函数中,程序会读入输入的表达式,并调用`parseExpr()`函数进行语法分析。如果语法分析过程中出现错误,程序会输出错误信息并退出。如果成功完成语法分析,程序会输出表达式的值。
下面是一个示例运行过程:
```
输入表达式: 9+5*2/3-6
9 + 5
5 * 2
2 / 3
14 - 6
结果:8.33333
```
阅读全文