1.“@”代替字符“ε”
2.同一非终结符如有多条产生式必须写成一行,中间用“|”分隔,不允许有空格
代码存在很多问题,大量“非正常”情况都未考虑,谨慎参考

#include<iostream>
#include<vector>
#include<string>
#include<fstream>using namespace std;struct exp{char ter; //终结符 bool e = false;  //是否能产生空转(用@表示) vector<string> nonter; //非终结符
};
vector<exp> v;    //产生式集合 string T = "";   //终结符集合
string first[20];   //所有非终结符的first集
string f ="";    //follow集 //将文件中的文法转换成产生式
void fun1(string str){exp e;e.ter = str[0];int i = 3;for(int k = i;k <str.length();k++){if(str[k] == '|'){e.nonter.push_back(str.substr(i,k-i));i = k + 1;} else if(str[k] == '@'){e.e = true;      //存在@(即空转) i = k + 2;k++;}}if(i < str.length()){e.nonter.push_back(str.substr(i));}v.push_back(e);T = T + str[0];
}//求first集
void fun3(int p,exp e,int index){for(int k = 0;k < e.nonter.size();k++){for(int i = index;i < e.nonter[k].length();i++){if(e.nonter[k][i] >= 'a'&&e.nonter[k][i] <= 'z'){first[p] += e.nonter[k][i];break;} else if(e.nonter[k][i] >= 'A'&&e.nonter[k][i] <= 'Z'){int j = T.find(e.nonter[k][i]);if(v[j].e){fun3(p,v[j],0);first[p] += '@';}else{fun3(p,v[j],0);break;}}}}}
void fun2(){for(int i = 0;i < v.size();i++){exp e = v[i];fun3(i,e,0);}
}//求follow集
void follow(char a){for(int i = 0;i < T.length();i++){for(int k = 0;k < v[i].nonter.size();k++){if(v[i].nonter[k].find(a) != string::npos){int j = v[i].nonter[k].find(a);if(j == v[i].nonter[k].length()-1){follow(T[i]);} else if(j < v[i].nonter[k].length()-1){char p = v[i].nonter[k][j+1];if(p >= 'a' && p <= 'z'){f += p;} else{int m = 0;for(;m < T.length();m++){if(T[m] == p){f = first[m];}} if(first[m].find('@') != string::npos){follow(T[i]);}}  }}}}
}int main(){ifstream open("D:\\1.txt");string str;if(!open.is_open())cout<<"open file failed"<<endl;while(getline(open,str)){fun1(str);}open.close();fun2();cout<<"first集如下:"<<endl;for(int len = 0;len < T.length();len++){if(v[len].e){first[len] += '@';}cout<<T[len]<<": "<<first[len]<<endl;}cout<<"输入非终结符:"<<endl;char a;cin>>a;follow(a);if(T.find(a) != string::npos){f += '$';}string::iterator it;//除去@,因为follow集中不能有@(空转) for (it = f.begin(); it < f.end(); it++){if (*it == '@'){str.erase(it);it--;}}cout<<a<<"的follow集:"<<f<<endl;return 0;
}


C++实现first集follow集相关推荐

  1. 编译原理 First集 Follow集 select集 通俗易懂的讲解 + 实例

    #First集Follow集通俗易懂的讲解加实例 ##First 如A->aB | CD 这里面包含了组成First(A)的两种情况: 以终结符开头,当然要把这个终结符(a)放到A的First里 ...

  2. 编译原理 求first集 follow集

    FIrst集: FIRST集是一个文法符号串所可能推导出的符号串的第一个终结符的集合 First集合最终是对产生式右部的字符串而言的,但其关键是求出非终结符的First集合,由于终结符的First集合 ...

  3. FIRST集和FOLLOW集的计算

    文章目录 `FIRST`集的计算 计算`FIRST(x)` 具体算法 计算`$X_21,X_2,X_3,...,X_n$`的`FIRST`集 FOLLOW集的计算 算法 FIRST集的计算 计算FIR ...

  4. 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现

    编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...

  5. FIRST集与FOLLOW集构造步骤

    首先,这两个集主语是候选式,是V*中的一个终结符/非终结符. 由于FOLLOW集的定义和构造步骤里面都涉及FIRST集,故先介绍FIRST集. 一.FIRST集的定义如下: FIRST(α)={a|α ...

  6. 编译原理-First集和Follow集

    刚学first集和follow集的时候,如果上课老师没有讲明白或者自己没听明白,自己看的时候还真是有点难理解,不过结合着具体的题目可以理解的更快. 先看一下两种集合的求法: First集合的求法:   ...

  7. FIRST集和FOLLOW集的构造

    FIRST集和FOLLOW集的定义 注意:1:FIRST集的定义中\(\alpha和\beta\)可以是终结符也可以是非终结符.2:FOLLOW集的定义中\(\mu和\beta\)可以是终结符也可以是 ...

  8. 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理

    本次笔记内容: 4-4 FIRST集和FOLLOW集 4-5 递归的预测分析法 4-6 非递归的预测分析法 4-7 预测分析法中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析 ...

  9. First集、Follow集

    构建First集 求First集步骤 首先,对所有非终结符A, 先设定FIRST(A)= {} (空) FIRST(A) = { t | A → tw },t为终结符,w为任意类型 然后, 对每一个产 ...

最新文章

  1. 应用phpcms时遇到的问题及smarty标签的应用
  2. 码神之路博客项目构建记录
  3. Python4:DataStructure
  4. 指针变量的定义与引用
  5. HTML5 API详解(10):sessionStorage 你用过吗?
  6. 小米新生态总监董红光:致力打造智能服务开放平台
  7. 编译报错程序集版本高于所引用的程序集的版本
  8. 计算机网络每日一题,【计算机考研】每日一题-数网操-35
  9. CSS代码实现背景透明文字不透明
  10. 个税系统服务器怎么设置,如何开通个税服务器地址
  11. 微信小程序之input前加图标
  12. 参考文献格式字号字体_关于论文格式要求及字体大小
  13. 区块链读书笔记01-区块链基础
  14. Java变态题目(持续更新)
  15. 磊科linux无线网卡驱动安装步骤,如何安装磊科无线网卡驱动教程
  16. 计算机服务用什么打开,bonjour是什么软件_在win7电脑中打开itunes程序却提示bonjour服务已被禁用怎么办?...
  17. ubuntu切换java版本
  18. 【知乎讨论】如何评价《上海生活垃圾管理条例》中的垃圾分类标准?
  19. 在WPF中加载gif动态图片
  20. 天空之门手游怎么用电脑玩 天空之门手游模拟器教程

热门文章

  1. 百度VidPress Sports团队获SoccerNet-v2足球视频理解竞赛双料冠军
  2. SendEMail 发送邮件
  3. Linux 网络设备驱动(dm9000)
  4. 学习笔记(15):R语言入门基础-增加行或列
  5. 大龄青年自学Java,如何找到第一份工作?
  6. 百度和360的关键词提交
  7. 天猫店群玩法有流量销售额却上不去?可能是转化率出了问题。
  8. matlab currentcharacter,新人求助。
  9. 2021年全球点对点天线行业调研及趋势分析报告
  10. 科技筑梦创新成长 “探知未来”一直在路上