编译原理lr算法c语言实现,编译原理 算法3.8 LR分析 c++11实现

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8 using namespacestd;9

10 using Production = pair>;11

12 const int max_state = 110;13 const int delay_num =5e8;14

15 structParserLR16 {17

18 map mp_n; //非终结符映射

19 map mp_t; //终结符映射

20 vector P; //产生式

21 vector N, T; //非终结符,终结符

22 intstate_num, operator_num, nonterminal_num, terminal_num, production_num;23 vectoraction[max_state];24 vector_goto[max_state];25 int init(stringfilename)26 {27 N.clear();28 T.clear();29 P.clear();30 mp_n.clear();31 mp_t.clear();32 for (int i = 0; i < max_state; i++)33 {34 action[i].clear();35 _goto[i].clear();36 }37 state_num = operator_num = nonterminal_num = terminal_num = production_num = 0;38 ifstream in(filename, ios::in);39 if (!in.is_open())40 return 0;41 in >>terminal_num;42 for (int i = 0; i < terminal_num; i++)43 {44 stringtmp;45 in >>tmp;46 T.emplace_back(tmp);47 mp_t[tmp] =i;48 }49 in >>nonterminal_num;50 for (int i = 0; i < nonterminal_num; i++)51 {52 stringtmp;53 in >>tmp;54 N.emplace_back(tmp);55 mp_n[tmp] =i;56 }57 in >>production_num;58 for (int i = 0; i < production_num; i++)59 {60 Production cur;61 in >>cur.first;62 intsz;63 in >>sz;64 for (int j = 0; j < sz; j++)65 {66 stringt;67 in >>t;68 cur.second.emplace_back(t);69 }70 P.emplace_back(cur);71 }72 in >>state_num;73 for (int i = 0; i <= state_num; i++)74 for (int j = 0; j < terminal_num; j++)75 {76 stringtmp;77 in >>tmp;78 action[i].emplace_back(tmp);79 }80 for (int i = 0; i <= state_num; i++)81 for (int j = 0; j < nonterminal_num; j++)82 {83 inttmp;84 in >>tmp;85 _goto[i].emplace_back(tmp);86 }87 return 1;88 }89 Production getProduction(intidx)90 {91 return P[idx - 1];92 }93 pair> analyze(vector input) //first->出错位置,-1代表无错

94 {95 vectorerror;96 vectorsuccess;97 stack ch; //符号栈

98 stack st; //状态栈

99 ch.emplace("#");100 st.emplace(0);101 input.emplace_back("#");102 int sz =input.size();103 for (int i = 0; i

110 string at =action[top][ip];111 if (at[0] == ‘r‘) //规约

112 {113 string res = at.substr(1, at.size());114 int num =stoi(res);115 Production trans =getProduction(num);116 for (int i = 0; i < trans.second.size(); i++)117 {118 st.pop();119 ch.pop();120 }121 top =st.top();122 string cur =trans.first;123 ch.emplace(cur);124 st.emplace(_goto[top][mp_n[cur]]);125 success.emplace_back(trans);126 }127 else if (at[0] == ‘s‘) //移进

128 {129 string res = at.substr(1, at.size());130 int to_state =stoi(res);131 st.emplace(to_state);132 ch.emplace(now);133 i++;134 }135 else if (at == "acc") //接受

136 return make_pair(-1, success);137 else //error

138 {139 if (now == "#")140 return make_pair(i - 1, success);141 returnmake_pair(i, success);142 }143 }144 return make_pair(1, error);145 }146 };147 inline voiddelay()148 {149 for (int i = 0; i < delay_num; i++)150 ;151 }152 inline void display(const pair> &out)153 {154 if (out.first == -1)155 {156 for (int i = 0; i < out.second.size(); i++)157 {158 cout << out.second[i].first << "->";159 for (int j = 0; j < out.second[i].second.size(); j++)160 cout << out.second[i].second[j];161 cout << "\n";162 }163 }164 else

165 cout << "在第" << out.first + 1 << "个终结符出错.\n";166 }167 int main(int argc, char const *argv[])168 {169 ParserLR app;170 string filename = "prj3_8_in.txt";171 if(app.init(filename))172 {173

174 cout << "构建分析器中";175 delay();176 cout << ".";177 delay();178 cout << ".";179 delay();180 cout << ".\n";181 delay();182 cout << "构建成功.\n";183 cout << "请输入终结符个数:";184 intsz;185 cin >>sz;186 cout << "请输入包含" << sz << "个终结符的待分析序列, 终结符间需用空格分离:";187 vectoral;188 for (int i = 0; i < sz; i++)189 {190 stringtmp;191 cin >>tmp;192 al.emplace_back(tmp);193 }194 cout << "开始分析";195 delay();196 cout << ".";197 delay();198 cout << ".";199 delay();200 cout << ".\n";201 delay();202 cout << "分析结束.\n";203 pair> out =app.analyze(al);204 cout << "分析成功,结果如下:\n";205 display(out);206 }207 return 0;208 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值