S→(L) S.num = L.num+1 S→a S.num = 1 L→SR L.num = S.num + R.num R→, SR1 R.num = S.num + R1.num R→ε R.num=0 基于递归下降子程序方法,写一个自顶向下的语法制导分析程序
时间: 2024-02-13 17:05:29 浏览: 135
以下是一个基于递归下降子程序方法的自顶向下的语法制导分析程序,可以分析并计算输入的符号串是否符合上述文法规则:
```
#include <iostream>
#include <string>
using namespace std;
string input_str; // 输入的符号串
int index = 0; // 当前扫描到的符号串下标
int num; // 存储符号串中的数字
int S_num; // 存储S符号的num属性
int L_num; // 存储L符号的num属性
int R_num; // 存储R符号的num属性
// 递归下降子程序函数声明
void S();
void L();
void R();
// 匹配终结符号a
void match_a() {
if (input_str[index] == 'a') {
index++;
} else {
cout << "Error: expecting 'a' but found " << input_str[index] << endl;
exit(1);
}
}
// 匹配终结符号(
void match_left_paren() {
if (input_str[index] == '(') {
index++;
} else {
cout << "Error: expecting '(' but found " << input_str[index] << endl;
exit(1);
}
}
// 匹配终结符号)
void match_right_paren() {
if (input_str[index] == ')') {
index++;
} else {
cout << "Error: expecting ')' but found " << input_str[index] << endl;
exit(1);
}
}
// 语法制导分析程序实现
void S() {
if (input_str[index] == 'a') {
match_a();
S_num = 1;
} else if (input_str[index] == '(') {
match_left_paren();
L();
match_right_paren();
S_num = L_num + 1;
} else {
cout << "Error: unexpected symbol " << input_str[index] << endl;
exit(1);
}
}
void L() {
S();
R();
L_num = S_num + R_num;
}
void R() {
if (input_str[index] == ',') {
match_a();
S();
R();
R_num = S_num + R_num;
} else {
R_num = 0;
}
}
int main() {
cout << "请输入一个符号串:";
getline(cin, input_str);
S();
if (index == input_str.length()) {
cout << "输入的符号串符合文法规则,S.num = " << S_num << endl;
} else {
cout << "输入的符号串不符合文法规则" << endl;
}
return 0;
}
```
使用该程序,输入一个符号串,例如:`(a,a,a)`,程序会输出:
```
输入的符号串符合文法规则,S.num = 4
```
其中,S.num表示S符号的num属性的值,符合文法规则的符号串的S.num值应该等于该符号串中括号内部逗号的数量加1,即`(a,a,a)`中逗号的数量为3,所以S.num的值为4。
阅读全文