• 大小: 20KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-07-01
  • 语言: C/C++
  • 标签:

资源简介

使用LL(1)方法实现的语法分析程序,使用C++编程,其中包含消除左递归,求非终结符的FIRST、FOLLOW集,求LL(1)分析表以及对输入字符串的接受过程分析。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
using namespace std;

typedef struct VN
{
char symbol;
vector p;//该非终结符的产生式
vector first;//该非终结符的FIRST集
vector follow;//该非终结符的FOLLOW集
}N;//非终结符
typedef  struct VT
{
char vt;
}T;//终结符 num 用 n 代替
vector vn;//定义非终结符集合
vector vt;//定义终结符集合
vector< vector > tab;//分析表

void getN(vector *n);//获取非终结符
void putN(vector n);//输出非终结符
void getT(vector *t);//获取终结符
void putT(vector t);//输出终结符
void getpRules(vector *n);//获取产生式
void elimiLR(vector *n);//消除产生式中的左递归
void getFirst(vector *n);//获取非终结符的FIRST集
void getFollow(vector *n);//获取非终结符的FOLLOW集
bool isVN(char s  vector n);//判断符号是否为非终结符
bool isVT(char s  vector t);//判断符号是否为终结符
bool isEmptyIn(N n);//判断非终结符FIRST集是否含有空元素,有空元素(true);没空元素(false)
int getVnPos(char s vector n);//获取某个非终结符在非终结符集合中的位置
int getVtPos(char c vector T);//获取某个终结符在终结符集合中的位置
bool isExist(char c N n int i);//判断新求得的元素 是否和 FIRST(1)/FOLLOW(2)集 已有元素重复,若重复返回true,不重复返回false
void analysisTab();//建立带有同步信息的预测分析表并输出
void analysisProc();//预测分析程序并根据同步信息进行错误处理

int main(void)
{
getN( &vn );//获取非终结符
getT( &vt );//获取终结符
getpRules(&vn);//获取产生式
elimiLR(&vn);//消除左递归
getFirst(&vn);//为每个非终结符生成FIRST集
getFollow(&vn);//为每个非终结符生成FOLLOW集
putN(vn);//输出消除左递归后的文法
putT(vt);//输出文法的终结符
analysisTab();//建立带有同步信息的预测分析表并输出该表
analysisProc();//预测分析程序并根据同步信息进行适当错误处理
system(“pause“);
return 0;
}

void getN(vector *n)//获取非终结符
{
cout << “\n请输入非终结符( end with $ ):“ << endl;
char c;
cin >> c;
while (c != ‘$‘)
{
N temp;
temp.symbol = c;
n->push_back(temp);
cin >> c;
}
}

void putN(vector n)//输出非终结符
{
cout << “消除左递归后的文法如下:“ << endl;
if (n.size() > 0)
{
for (unsigned int i = 0; i < (n.size()); i++)//第i个非终结符
{
cout << “非终结符为 : “;
cout << n.at(i).symbol << endl;//非终结符符号
if (n.at(i).p.size() > 0)
//非终结符的产生式数不为0打印每个产生式
{
cout << “非终结符 “ << n.at(i).symbol << “ 推导出的产生式如下 : “ << endl;
for (size_t j = 0; j < n.at(i).p.size(); j++)
{//print every production rule

cout << n.at(i).p.at(j) << “ “ ;
}
cout << endl;
}
else
{
cout << “there is no production rule(s) of “ << n.at(i).symbol << endl;
}
if (n.at(i).first.size() > 0)
//FIRST集个数不为0,打印FIRST集每个元素
{
cout << “非终结符 “ << n.at(i).symbol << “ 的FIRST集元素为 :“;
for (size_t k = 0; k < n.at(i).first.size(); k++)
{//打印FIRST集的每个元素
cout << n.at(i).first.at(k) << “ “;
}
cout << endl;
}
else
{
cout << “there is no element in “ << n.at(i).symbol << “\‘s FIRST set.“ << endl;
}
if (n.at(i).follow.size() > 0)
//FOLLOW集个数不为0,打印FIRST集每个元素
{
cout << “非终结符 “ << n.at(i).symbol << “ 的FOLLOW集元素为 :“;
for (size_t l = 0; l < n.at(i).follow.size(); l++)
{//打印FOLLOW集的每个元素
cout << n.at(i).follow.at(l) << “ “;
}
cout << endl;
}
else

评论

共有 条评论