C++实现编译原理:求非终结符的first集与follow集
5星 · 超过95%的资源 需积分: 31 182 浏览量
更新于2024-09-20
4
收藏 5KB TXT 举报
"该资源是关于编译原理的程序实现,用于求解上下文无关文法的非终结符first集合和follow集合。作者为YFLAHU09,编写时间为2011年10月30日。程序使用C++语言编写,包括对输入文法规则的处理、符号表的管理以及first集和follow集的计算。"
在编译原理中,`first集`和`follow集`是构建解析表的关键概念,它们用于分析上下文无关文法(Context-Free Grammar, CFG)。这两个集合帮助我们理解语法结构并指导自顶向下的语法分析过程,如LL(1)或LR(1)解析。
1. **First集**:
- 首先,`first集`是文法中一个非终结符或起始符号的所有可能的开始符号(终结符)的集合。如果非终结符可以产生空串(ε),那么空串也会被包含在first集中。
- 在程序中,`fir`集合用于存储每个非终结符的first集。
- 程序通过遍历文法规则,检查非终结符能否以不同的终结符开始,逐步构造first集。
- `isToEmpty()`函数可能是用来判断非终结符是否能产生空串的。
2. **Follow集**:
- `follow集`是文法中每个非终结符在句子中可能出现在哪些终结符之后的集合。
- 在程序中,`follow`集合用于存储每个非终结符的follow集。
- 计算follow集时,我们需要考虑文法规则的右部,以及first集的信息,尤其是当非终结符出现在右部的尾部时。
- `capL()`函数用于判断字符是否为大写字母,这可能是为了区分非终结符(通常大写)和终结符(通常小写)。
3. **算法流程**:
- 输入文法规则,将它们存储在`sentence`和`senRever`映射中。
- 初始化`ter`集合来存储终结符,`toEmpty`映射记录非终结符是否可以产生空串。
- 初始化`fir`和`follow`集合,分别用于first集和follow集。
- 使用循环和递归策略更新first集和follow集。
- 当first集不再变化时,表示计算完成。
4. **程序结构**:
- `multimap<char, string>` `sentence`用于存储文法规则,`multimap<string, char> senRever`用于规则的反向引用。
- `set<char> ter`存储所有终结符,`map<char, bool> toEmpty`标记非终结符是否能产生空串。
- `vector<string> rightSide`存储文法规则的右部,便于处理。
- `char Begin`可能是起始符号,程序中的其他辅助函数如`capL()`用于字符判断。
这个C++程序提供了一个基础的框架,用于计算给定上下文无关文法的first集和follow集。然而,完整的算法和实现细节可能在注释的剩余部分,这部分代码没有提供。实际应用中,还需要考虑处理递归、左递归和左因子提取等问题,以确保算法的正确性和效率。
2012-04-03 上传
2022-08-08 上传
2022-08-08 上传
132 浏览量
2009-06-01 上传
点击了解资源详情
Primer
- 粉丝: 6
- 资源: 13
最新资源
- lang-3-Projet:语言创作
- mybatis实体注释为中文
- node-imageinfo:一个 node.js 包,返回有关图像或 Flash 文件的信息,例如类型、尺寸等
- 改进的存储
- gunterx
- CSGOContainerStats:Python脚本,用于分析打开的csgo容器的Steam库存历史记录并将结果写入文本文件
- creative:使用HTMLCSS和JAVASCRIPT的基本注册表单网页
- chat_AntDERN_stack
- Sb3Generator.github.io
- PythonKeylogger
- TestProoo:s
- 演示通过easyExcel来导出excel数据
- rigel-social:一个社交媒体网站,用户可以在其中发布、点赞、评论和关注、取消关注。
- super-i18n:jquery插件,用于i18n翻译网站多种语言
- TwoDicePig:将两个骰子猪游戏制作成一个Android应用程序(于2020年1月制作,但于2020年8月上传)
- hljs-enhance:to在Highlight.js中添加了一些额外的东西