概述
递归下降分析器
- 分析结果
- 描述
- 程序实现
分析结果
不合法语义
描述
含有左递归的表达式文法
E
→
E
+
T
∣
T
E rightarrow E+T | T
E→E+T∣T
T
→
T
∗
F
∣
F
Trightarrow T * F | F
T→T∗F∣F
F
→
(
E
)
∣
i
F rightarrow(E) | i
F→(E)∣i
消除左递归后
E
→
T
E
′
E rightarrow TE'
E→TE′
E
′
→
+
T
E
′
∣
ε
E'rightarrow +TE' | varepsilon
E′→+TE′∣ε
T
→
F
T
′
T rightarrow FT'
T→FT′
T
′
→
∗
F
T
′
∣
ε
T' rightarrow *FT' | varepsilon
T′→∗FT′∣ε
F
→
(
E
)
∣
i
F rightarrow(E) | i
F→(E)∣i
程序实现
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
string str; // 输入表达式
int start = 0; // 待读取表达式位置
int idx = 0; // 序号
vector<string> st; // 符号栈
void E();
void E1();
void F();
void T();
void T1();
void input() {
cout << "输入表达式 -> ";
getline(cin, str);
//str = "i*(i+i)";
cout << endl;
}
void print() {
cout << "t " << idx << "t ";
string t("");
for (auto& e : st) t += e;
printf("%-10st", t.c_str());
cout << str.substr(start) << "tt ";
}
void check() {
printf("t 序号t 符号栈 t 待分析字符串 t 表达式 n");
st.push_back("#");
st.push_back("E");
print();
idx++;
cout << endl;
E();
if (st.back() != "#") cout << "语义不合法" << endl;
else cout << "语义合法 " << endl;
}
void E() {
print(); //打印当前步骤信息
printf("E->TE'n");
st.pop_back();
st.push_back("E`");
st.push_back("T");
idx++;
T();
E1();
}
void E1() {
if (str[start] == '+') {
print();
printf("E'->+TE'n"); //输出表达式
st.pop_back();
st.push_back("E`");
st.push_back("T");
idx++;
start++;
T();
E1();
}
else {
print();
printf("E'->εn");
st.pop_back();
idx++;
}
}
void F() {
if (str[start] == 'i'){ //若待分析字符匹配‘i’
print();
printf("F->in");
st.pop_back();
idx++;
start++;
}
else if (str[start] == '('){ //若待分析字符匹配‘(’
print();
printf("F->(E)n");
st.pop_back();
st.push_back("E");
idx++;
start++;
E();
if (str[start] == ')'){ //若待分析字符匹配‘)’
start++;
}
else{
printf("没有')'匹配!n");
return;
}
}
else{
printf("errorn");
return;
}
}
void T() {
print(); //打印当前步骤信息
printf("T->FT'n"); //输出表达式
st.pop_back();
st.push_back("T`");
st.push_back("F");
idx++; //分析步数+1
F();
T1();
}
void T1(){
if (str[start] == '*'){ //若待分析字符匹配‘*’
print();
printf("T'->*FT'n");
st.pop_back();
st.push_back("T`");
st.push_back("F");
idx++;
start++;
F();
T1();
}
else{
print();
printf("T'->εn");
st.pop_back();
idx++;
}
}
最后
以上就是专注鸡为你收集整理的编译原理,递归下降分析器分析结果描述程序实现的全部内容,希望文章能够帮你解决编译原理,递归下降分析器分析结果描述程序实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复