资源简介
编译原理实现LL(1)包括消除左递归,求First集,Follow集,预测分析表,预测分析过程
代码片段和文件信息
#include “StdAfx.h“
#include “CSyntaxAnalysis.h“
CSyntaxAnalysis::CSyntaxAnalysis(void)
{
}
CSyntaxAnalysis::~CSyntaxAnalysis(void)
{
}
void CSyntaxAnalysis::ClearAll()
{
startLL = ““; // LL(1)开始符号
Terminator.clear(); // 保存终结符
Non_Terminator.clear(); // 保存非终结符
Input_Grammar.clear(); // 保存当初输入的文法
NoLeftRe_Grammar.clear(); // 保存消除左递归的文法
Left.clear(); // 保存消除左递归后的文法的左部集合
HaveVisited.clear(); // 保存非终结符是否访问过
NoLeftRe_Grammar_Gather.clear(); // 保存左部->右边集合形如 A:{sA‘@}
FirstGather.clear(); // First 集合
FollowGather.clear(); // Follow 集合
SelectGather.clear(); // Select 集合
anaStr.clear(); // 要分析的字符串
ShowHaveMatch.clear(); // 显示的已匹配
ShowStaGrammar.clear(); // 显示的队列
ShowInput.clear(); // 显示的输入
ShowActions.clear(); // 显示的动作
}
// 总流程控制
void CSyntaxAnalysis::Commander()
{
if(JudgeGrammar()) // 判断输入的文法是否合法
{
UniteOR(); // 合并能合并的 文法
RemoveLeft_Recursive(); // 消除左递归
SplitOR(); // 拆分能拆分的 文法
GetLEFT_GATHER(); // 获得左部->集合
FindLeft(); // 获得左部集合
GetFirstGather(0); // 查找First集合
for (int i = 0;i < HaveVisited.size();i++) // 重新赋值
{
HaveVisited[i] = false;
}
GetFollowGather(0); // 获得FOLLOE集合
GetSelectGather(); // 获得SELECT集
if(!IsLegalLL()) // 判断是不是LL(1)
AfxMessageBox(“NOT THE LL(1)!“);
else // 执行分析过程
{
PredictAnalysis(anaStr);
}
}
else// 错误信息
{
CString infor = “文法错误,请检查!“;
infor.Append(“\r\n“);
infor.Append(“不合法情况:“);
infor.Append(“\r\n“);
infor.Append(“(1)形如 A->A“);
infor.Append(“\r\n“);
infor.Append( “(2)形如 A->“);
AfxMessageBox(infor);
}
}
//---------------------------------------------------------------------------------------------------------
// 判断文法是否合法
// 满足条件:
// (1)左部以非终结符开始,并且只有一个
// (2)右部必须有非终结符,并且只能用零个或多个终结符和非终结符组成
// 不合法情况
// (1) 形如 A->A
// (2) 形如 A->
bool CSyntaxAnalysis::JudgeGrammar()
{
for(int i = 0;i < Input_Grammar.size();i++)
{
int nEnd = 0;
bool HaveNon_T = false; // 记录右边是否含有非终结符
CString startGrammar = ““; // 左部字符
nEnd = Input_Grammar[i].Find(“->“);
startGrammar = Input_Grammar[i].Mid(0 nEnd);
if (startGrammar == Input_Grammar[i].Mid(nEnd + 2 Input_Grammar[i].GetLength() - nEnd - 2))
return false;// (1) 形如 A->A
if ((Input_Grammar[i].GetLength() - nEnd - 2) < 0)
return false;// (2) 形如 A->
if(find(Non_Terminator.begin() Non_Terminator.end() startGrammar) == Non_Terminator.end())
return false;// 不是非终结符
for(int j = nEnd + 2;j < Input_Grammar[i].GetLength() - nEnd - 2;j++)
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 62194 2010-12-08 16:40 Syntax_Analysis\Syntax_Analysis\CSyntaxAnalysis.cpp
文件 4039 2010-12-07 18:31 Syntax_Analysis\Syntax_Analysis\CSyntaxAnalysis.h
文件 1000 2010-12-07 14:43 Syntax_Analysis\Syntax_Analysis\ExampleDlg.cpp
文件 413 2010-12-07 14:37 Syntax_Analysis\Syntax_Analysis\ExampleDlg.h
文件 491 2010-12-01 21:44 Syntax_Analysis\Syntax_Analysis\InforDlg.cpp
文件 363 2010-12-01 21:44 Syntax_Analysis\Syntax_Analysis\InforDlg.h
文件 3035 2010-11-30 22:38 Syntax_Analysis\Syntax_Analysis\ReadMe.txt
文件 21630 2005-09-23 09:25 Syntax_Analysis\Syntax_Analysis\res\Syntax_Analysis.ico
文件 371 2010-11-30 22:38 Syntax_Analysis\Syntax_Analysis\res\Syntax_Analysis.rc2
文件 1469 2010-12-07 14:49 Syntax_Analysis\Syntax_Analysis\resource.h
文件 146 2010-11-30 22:38 Syntax_Analysis\Syntax_Analysis\stdafx.cpp
文件 2489 2010-11-30 22:38 Syntax_Analysis\Syntax_Analysis\stdafx.h
文件 61744 2010-12-07 14:52 Syntax_Analysis\Syntax_Analysis\Syntax_Analysis.aps
文件 1766 2010-11-30 22:38 Syntax_Analysis\Syntax_Analysis\Syntax_Analysis.cpp
文件 495 2010-11-30 22:38 Syntax_Analysis\Syntax_Analysis\Syntax_Analysis.h
文件 8720 2010-12-07 14:52 Syntax_Analysis\Syntax_Analysis\Syntax_Analysis.rc
文件 5967 2010-12-07 14:37 Syntax_Analysis\Syntax_Analysis\Syntax_Analysis.vcproj
文件 1427 2010-12-08 16:40 Syntax_Analysis\Syntax_Analysis\Syntax_Analysis.vcproj.LIUCHANGCHUN-PC.Administrator.user
文件 1405 2010-12-03 17:00 Syntax_Analysis\Syntax_Analysis\Syntax_Analysis.vcproj.PC92.Administrator.user
文件 9919 2010-12-07 19:55 Syntax_Analysis\Syntax_Analysis\Syntax_AnalysisDlg.cpp
文件 1014 2010-12-07 14:52 Syntax_Analysis\Syntax_Analysis\Syntax_AnalysisDlg.h
文件 910 2010-12-02 20:24 Syntax_Analysis\Syntax_Analysis.sln
..A..H. 53760 2010-12-08 16:40 Syntax_Analysis\Syntax_Analysis.suo
目录 0 2010-12-03 23:15 Syntax_Analysis\Syntax_Analysis\res
目录 0 2010-12-08 16:41 Syntax_Analysis\Syntax_Analysis
目录 0 2010-12-08 16:45 Syntax_Analysis
----------- --------- ---------- ----- ----
244767 26
- 上一篇:点菜系统需求分析及数据流图
- 下一篇:学生信息管理系统数据库系统设计
相关资源
- SLR1语法分析生成器
- 编译原理优先算法代码,及详细实验
- 编译原理 课后习题答案 陈意云 张昱
- 编译原理语法树的实现
- 编译原理实验MiniPascal编译器设计 Fl
- 子集构造法NFA的确定化
- OPCDAAuto.dll(v2.2.5.30) 测试好用的
- 程序设计语言 编译原理 第三版 国防
- 编译原理First集Follow集求解
- 云南大学软件学院编译原理实验1-5
- 山东科技大学编译原理课程设计
- 编译原理 实现TINY+编译器 课程实验报
- 广工编译原理历年真题及答案
- seu编译原理课程设计
- 符号表设计与实现
- 2014-20152编译原理-期末B卷.docx
- NFA确定化与DFA最小化
- 算术表达式翻译成对应的后缀表达式
- 编译原理学习大全,详解
- 广工编译原理实验报告+可执行程序
- [典例]编译原理学习笔记·文法的构造
- 广东工业大学编译原理实验报告PL0语
- 编译器的设计与实现 编译原理课程设
- 编译原理 华保健
- 编译原理课程设计完整
- NFA转换成DFA——编译原理
- LL1文法的判别以及非LL1文法的转换完
- Chomsky文法类型判断编译原理实验完整
- 山东大学编译原理2017试题
- 编译原理答案陈文宇、王晓斌
评论
共有 条评论