背景

期末考试免考,冲!

实验名称

FIRSTVT集生成算法

实验时间

2020年6月3日 到 2020年6月9日

院系

信息科学与工程学院

组员姓名

Chocolate、kry2025、钟先生、leo、小光

实验环境介绍

  • windows 10 操作系统
  • Eclipse 进行 java 编程
  • CodeBlocks 进行 C++ 编程

实验目的与要求

目的

  • 深刻理解FIRSTVT集生成算法
  • 掌握FIRSTVT集生成的过程
  • 加强团队合作能力
  • 提高自身的编程能力和解决问题的能力

要求

  • 编程实现FIRSTVT集生成算法
  • 算法简洁,不冗余

解决问题

Firstvt集的求法,有三条规则:
(1)A->a…,即以终结符开头,该终结符入Firstvt
(2)A->B…,即以非终结符开头,该非终结符的Firstvt入A的Firstvt
(3)A->Ba…,即先以非终结符开头,紧跟终结符,则终结符入Firstvt

实验结果

源代码

#include<bits/stdc++.h>
#define endl '\n'
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1e3+5;
class node{public:string left;vector<string> right;node(const string& str){  //类似构造函数left=str;right.clear();}void push(char str[]){  //放入产生式右部right.push_back(str);}void print(){  //打印产生式printf("%s->%s",left.c_str(),right[0].c_str());for(int i=1;i<right.size();i++)printf("|%s",right[i].c_str());puts("");}
};
int n;
char buf[maxn];
int used[maxn],vis[maxn];
vector<node> vnode;
map<string,int> mp;
vector<char> vt;
set<char> firstVt[maxn];
//dfs搜索
void dfs(int x){if(vis[x]) return;vis[x]=1;string& left=vnode[x].left;  //取出当前产生式左部for(int i=0;i<vnode[x].right.size();i++){string& str=vnode[x].right[i];   //取出当前产生式右部if(isupper(str[0])){  //如果产生式右部第一个为非终结符int y=mp[str.substr(0,1)]-1;   //拿到对应下标if(str.length()>1 && !isupper(str[1]))  //判断第二个是否为终结符,是的话加入firstVt[x].insert(str[1]);dfs(y);   //搜索当前非终结符set<char>::iterator it = firstVt[y].begin();for(;it!=firstVt[y].end();it++)   //加入非终结符y的firstVt集合firstVt[x].insert(*it);}else{firstVt[x].insert(str[0]);  //如果是终结符,直接加入}}
}
void makeFirstVt(){memset(vis,0,sizeof(vis));for(int i=0;i<vnode.size();i++){if(vis[i]) continue;else dfs(i);}puts("------------FIRSTVT集-------------------");for(int i=0;i<vnode.size();i++){printf("%s : ",vnode[i].left.c_str() );set<char>::iterator it = firstVt[i].begin();for(;it!=firstVt[i].end();it++)printf("%c ",*it);puts("");}
}
//初始化工作,清空数组
void init(){memset(used,0,sizeof(used)); //初始化used数组,用于记录VT集vt.clear();   //清空VT集合vnode.clear();  //清空产生式node集mp.clear();    //清空维护产生式下标集for(int i=0;i<=maxn;i++)   //清空输出结果firstVt集firstVt[i].clear();
}
int main(){while(cin>>n){init();  //初始化工作for(int i=0;i<n;i++){scanf("%s",buf);   //输入产生式int len=strlen(buf),j;for(j=0;j<len;j++)if(buf[j]=='-'){buf[j]=0;break;}string tmp=buf; //取产生式左部非终结符if(!mp[tmp]){vnode.push_back(node(tmp));  //去重操作mp[tmp]=vnode.size();  //维护下标}int idx=mp[tmp]-1;vnode[idx].push(buf+j+2);  //vnode加入产生式右部for(int k=0;k<j;k++){   //检查产生式左部是否包含终结符if(!isupper(buf[k])){if(used[buf[k]]) continue;used[buf[k]]=1;vt.push_back(buf[k]);}}for(int k=j+2;k<len;k++){  //将产生式右部加入vt集合if(!isupper(buf[k])){if(used[buf[k]]) continue;vt.push_back(buf[k]);used[buf[k]]=vt.size();}}}puts("************VT集*******************");for(int i=0;i<vt.size();i++ )printf("%c ",vt[i]);puts("");cout<<endl;puts("*************产生式*****************");for(int i=0;i<vnode.size();i++)vnode[i].print();puts("************************************");cout<<endl;makeFirstVt();  //求FirstVt集}return 0;
}

输出结果

测试样例

8
E->E+T
E->T
T->T*F
T->F
F->P^F
F->P
P->(E)
P->i

参考文献

参考:编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)

【C++实现】编译原理 免考小队 FIRSTVT集生成算法相关推荐

  1. 【C++实现】编译原理 免考小队 NFA转换为等价的DFA

    背景 期末考试免考,冲! 实验名称 对任意给定的NFA M进行确定化操作 实验时间 2020年5月21日 到 2020年5月24日 院系 信息科学与工程学院 组员姓名 Chocolate.kry202 ...

  2. 【C++实现】编译原理 免考小队 消除一切左递归

    背景 期末考试免考,冲! 实验名称 消除一切左递归 实验时间 2020年5月27日 到 2020年5月31日 院系 信息科学与工程学院 组员姓名 Chocolate.kry2025.钟先生.leo.小 ...

  3. 计算机地图制图原理与算法,计算机地图制图原理与方法-基本图形生成算法.ppt...

    <计算机地图制图原理与方法-基本图形生成算法.ppt>由会员分享,可在线阅读,更多相关<计算机地图制图原理与方法-基本图形生成算法.ppt(35页珍藏版)>请在人人文库网上搜索 ...

  4. 编译原理LR(0)项目集规范族的构造详解

    学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...

  5. 编译原理LR(0)项目集规范族的构造和分析的构造

    学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...

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

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

  7. [编译原理]FIRST集合FOLLOW集的介绍和求解

    一.定义 1.FIRST集:看产生式左部 FIRST(α) = {a | α ⇒∗\stackrel{*}\Rightarrow⇒∗a···,a∈VTV_{T}VT​} FIRST(α)是α的所有可能 ...

  8. 编译原理 First集和Follow集的求法

    转载地址 https://blog.csdn.net/Alexander_Frank/article/details/51280798 自上而下分析: FIRST集求法 First集合最终是对产生式右 ...

  9. 最全!最完整的求first集和follow的代码!!!编译原理 FIRST集和FOLLOW集的求法 代码,程序,实验报告

    DEV C++ 项目实现 不会建项目的看这个-->如何创建项目 代码链接:https://pan.baidu.com/s/1VNdrSMXaKu3HI0UQ_TInUQ 提取码:b1qz 使用教 ...

最新文章

  1. vijos 1476 旅游规划题解
  2. 接口中可以有静态方法吗?
  3. 阿里云linux centos 一键部署web环境--图文详解
  4. html 轮播图_JS拖拽专题(二)——「实战」滑动轮播图的那点事儿
  5. webstom设置和monokia配色方案
  6. matlab中函数的公式计算,MATLAB怎样定义函数(入门) 有一函数 f(x,y)=x^2+sinxy+2y , 写一程序, 输入自变量的值,输出函数值....
  7. iOS开发--一步步教你彻底学会『iOS应用间相互跳转』
  8. 智能手机下半场迎来淘汰赛:有的拼供应链,有的打起了 AI 的主意
  9. java session超时判断_详解SpringBoot中Session超时原理说明
  10. matlab 积分进阶教程,matlab进阶微积分篇6
  11. 学习PMBOK对ITTO输入输出的技术工具整理(关系)
  12. 李开复致中国家长的信:培养快乐感性的孩子
  13. 褚橙是如何用互联网营销颠覆橙子的?
  14. AVS2的GB帧与s帧
  15. ubuntu-mysql的安装
  16. A Game of Thrones(11)
  17. 硬盘分类(HDD、HHD、SSD)简介
  18. 外网映射nginx端口丢失问题解决
  19. 如何实现微信自定义分享标题、图片、描述等信息
  20. 利用C#直接与MySQL数据库建立交互

热门文章

  1. 良知的清醒常常意味着糟糕的记忆力的标志。
  2. c语言微信小程序编程,微信小程序实现类似微信点击语音播放效果
  3. Javascript在线美化,格式化,js美化
  4. GM、VP、FVP、CIO都是什么职位
  5. 2020年R2移动式压力容器充装多少分及格及R2移动式压力容器充装考试申请表
  6. Centos 查看/搜素日志 查找文件、目录、内容等 常用命令
  7. 【比赛回顾】广工2020程序设计初赛B-秋夜easy
  8. QWT坐标刻度设置时的2个细节
  9. css翘边阴影图片,【CSS】翘边阴影
  10. Mr. Ms. Mrs. Miss 的区别