#include"EliminateLeftRecursion.h"
#include <set>
// 判断是否是终结符号
bool IsTerminator(std::string ch, const std::set<std::string>& terminator)
{
for (std::string item : terminator)
{
if (ch == item)
{
return true;
}
}
return false;
}
// 判断是否是非终结符号
bool IsNonterminal(std::string ch, std::set<std::string>& nonterminal)
{
for (std::string item : nonterminal)
{
if (ch == item)
{
return true;
}
}
return false;
}
// 获取句型的首字符
std::string GetFirstChar(std::string sentence)
{
std::string firstChar = sentence.substr(0, 1);
if (sentence.length() > 1 && sentence.substr(1, 1) == "'")
{
firstChar = sentence.substr(0, 2);
}
return firstChar;
}
// 求解终结符号集 和 非终结符号集
void GetTerminator_Nonterminal(const std::vector<std::string>& grammarList, std::set<std::string>& terminator, std::set<std::string>& nonterminal)
{
for (std::string oneGrammar : grammarList)
{
int len = oneGrammar.length();
for (int i = 0; i < len; i++)
{
if (oneGrammar[i] == '|')
{
continue;
}
else if (i < len - 1 && oneGrammar[i] == '-' && oneGrammar[i+1] == '>')
{
i++;
continue;
}
else if (i < len - 2 && oneGrammar[i] == ':' && oneGrammar[i + 1] == ':' && oneGrammar[i + 2] == '=')
{
i += 2;
continue;
}
else if (oneGrammar[i] >= 'A' && oneGrammar[i] <= 'Z')
{
if (i < len - 1 && oneGrammar[i + 1] == '\'')
{
nonterminal.insert(oneGrammar.substr(i, 1) + "'");
i++;
}
else
{
nonterminal.insert(oneGrammar.substr(i, 1));
}
}
else
{
terminator.insert(oneGrammar.substr(i, 1));
}
}
}
}
// 根据开始符号确定文法
std::vector<std::string> GetGrammar(std::string firstChar, const std::vector<std::string>& grammarList)
{
int grammarIndex;
std::string grammar;
std::vector<std::string> rightString;
for (grammarIndex = 0; grammarIndex < grammarList.size(); grammarIndex++)
{
if (firstChar == grammarList[grammarIndex].substr(0, firstChar.length()))
{
break;
}
}
std::vector<std::string> left_right = GetOneLeft_Right(grammarList[grammarIndex]);
// 把最左边的消除,只剩产生式的右侧
left_right.erase(left_right.begin());
return left_right;
}
void PrintSymbolSet(const std::set<std::string>& set)
{
for (std::string item : set)
{
std::cout << item << " ";
}
}
void GetRightString(const std::vector<std::string>& grammarList, std::set<std::string>& rightString)
{
std::vector<std::vector<std::string>> left_rightList;
GetLeft_RightList(grammarList, left_rightList);
for (std::vector<std::string> item : left_rightList)
{
for (int i = 1; i < item.size(); i++)
{
rightString.insert(item[i]);
}
}
}
// 打印产生式右侧的符号串
void PrintRightString(const std::set<std::string>& rightString)
{
for (std::string item : rightString)
{
std::cout << item << " ";
}
}
// 输入:句型和全部文法
// 返回:该句型的 FIRST 集
void GetOneFirst(std::string& sentence, std::vector<std::string>& First, const std::vector<std::string>& grammarList,
const std::set<std::string>& terminator, const std::set<std::string>& nonterminal)
{
std::string firstChar = GetFirstChar(sentence);
std::string leave = sentence.substr(firstChar.length(), 1);
if (IsTerminator(firstChar, terminator))
{
if (firstChar == "$")
{
for (int i = 1; i < sentence.length(); i++)
{
if (IsTerminator(sentence.substr(i, 1), terminator) && sentence.substr(i, 1) != "$")
{
First.push_back(sentence.substr(i, 1));
return;
}
}
}
First.push_back(firstChar);
return;
}
else
{
std::vector<std::string> rightList = GetGrammar(firstChar, grammarList);
for (std::string item : rightList)
{
sentence = item + sentence.substr(firstChar.length(), sentence.length());
std::cout << sentence << std::endl;
GetOneFirst(sentence, First, grammarList, terminator, nonterminal);
}
}
}
int main()
{
std::set<std::string> terminator;
std::set<std::string> nonterminal;
std::set<std::string> rightString;
std::vector<std::string> grammarList;
std::vector<std::vector<std::string>> left_rightList;
std::vector<std::string> First;
ReadGrammerFile(grammarList, "code3.txt");
GetRightString(grammarList, rightString);
PrintRightString(rightString);
GetTerminator_Nonterminal(grammarList, terminator, nonterminal);
std::string sentence = "BCc";
GetOneFirst(sentence, First, grammarList, terminator, nonterminal);
std::cout << std::endl;
for (auto item : First)
{
std::cout << item << " ";
}
return 0;
}
/*
*
E::=TE'
E'::=+TE'|$
T::=FT'
T'::=*FT'|$
F::=(E)|i
*/
编译原理LL(1)语法分析
需积分: 0 170 浏览量
2022-12-09
19:47:38
上传
评论 1
收藏 17KB RAR 举报
亦是远方
- 粉丝: 2w+
- 资源: 22
最新资源
- Qt开发知识、经验总结 包括Qss,数据库,Excel,Model/View等
- IV数据.xlsx
- foldcraftlauncher_262944.apk
- 珍藏多年的基于matlab实现潮流计算程序源代码集合,包含多个潮流计算程序.rar
- 使用FPGA实现串-并型乘法器
- 基于matlab实现针对基于双曲线定位的DV-Hop算法中误差误差出一种基于加权双曲线定位的DV-Hop改进算法.rar
- 基于matlab实现由遗传算法开发的整数规划,车辆调度问题.rar
- 电视家7.0(对电视配置要求高).apk
- 免费计算机毕业设计-基于JavaEE的医院病历管理系统设计与实现(包含论文+源码)
- 手机端 我的世界融合植物大战僵尸版.apk
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈