资源简介
第三次上机作业
1. 编写First和Follow函数,实现其求解过程。
(1)FIRST集合计算方法:
① 若Xa.., 则将终结符a加入FIRST(X)中;
② 若X,则将加入FIRST(X)中;
③ 若XY…,且Y属于非终结符,则将FIRST(Y)\{}加入到FIRST(X)中;(注:“\”表示除去元素,即FIRST(Y)中的非元素加入到FIRST(X)中。以下同理。)
④ 若XY1Y2..YK,且Y1,Y2,..Yi-1都是非终结符,且Y1,Y2,..Yi-1的FIRST集合中均包含,则将FIRST(Yj)的所有非元素加入到FIRST(X)中,(j=1,2,..i).特别地,若Y1~YK均有产生式,则将加到FIRST(X)中。
(2)FOLLOW集合计算方法:
① 对文法开始符号S,置$于FOLLOW(S)中。
② 若有AB,则将FIRST()\{} 加入FOLLOW(B)中。 (此处 可以为空)
③ 若A B 或A B ,且 * (即 属于FIRST()),则将 FOLLOW(A)加入FOLLOW(B)中(此处 可以为空)。
2. 测试文法:
A->BCDE
B->aBA|ε
C->F|ε
D->b|c|ε
E->e|ε
F->d|ε
代码片段和文件信息
#include
#include
#include
#include
using namespace std;
#define MAX 50
int NONE[MAX] = { 0 };
string strings; //产生式
string Vn; //非终结符
string Vt; //终结符
string first[MAX]; //存放每个终结符的first集
string First[MAX]; //存放每个非终结符的first集
string Follow[MAX]; //存放每个非终结符的follow集
int N; //产生式个数
struct STR
{
string left;
string right;
};
void rec(STR *p) //识别Vn和Vt
{
int i j;
for (i = 0;i < N;i++) //第i个产生式
{
for (j = 0;j < (int)p[i].left.length();j++)//左侧
{
if ((p[i].left[j] >= ‘A‘&&p[i].left[j] <= ‘Z‘)) //左侧第j个字母是大写
{
if (Vn.find(p[i].left[j])>100) //Vn里没找到返回很大的值
Vn += p[i].left[j];
}
else
{
if (Vt.find(p[i].left[j])>100) //小写字母放Vt
Vt += p[i].left[j];
}
}
for (j = 0;j < (int)p[i].right.length();j++)//右侧
{
if (!(p[i].right[j] >= ‘A‘&&p[i].right[j] <= ‘Z‘))
{
if (Vt.find(p[i].right[j])>100)
Vt += p[i].right[j];
}
else
{
if (Vn.find(p[i].right[j]) > 100)
Vn += p[i].right[j];
}
}
}
}
void getlr(STR *p int i) //将产生式的左右部分别放入left,right
{
int j;
for (j = 0;j { if (strings[j] == ‘-‘&&strings[j + 1] == ‘>‘)
{ p[i].left = strings.substr(0 j);
p[i].right = strings.substr(j + 2 strings.length() - j);
}
}
}
string Letter_First(STR *p char ch)
{
int t;
if (!(Vt.find(ch)>100)) //在Vt里,first就是自身
{
first[Vt.find(ch)] = ch;
return first[Vt.find(ch) - 1];
}
if (!(Vn.find(ch) > 100)) //在Vn中的第i个
{
for (int i = 0;i < N;i++) //第i个产生式
{
if (p[i].left[0] == ch) //左侧字符是ch
{
if (!(Vt.find(p[i].right[0])>100))
{
if (First[Vn.find(ch)].find(p[i].right[0]) > 100) //右侧第一个字符是Vt,加入Vni的first集合中
{
First[Vn.find(ch)] += p[i].right[0];
}
}
if (p[i].right[0] == ‘#‘)
{
if (First[Vn.find(ch)].find(‘#‘) > 100) //右侧第一个字符是空,加入Vni的first集合中
{
First[Vn.find(ch)] += ‘#‘;
}
}
if (!(Vn.find(p[i].right[0]) > 100)) //右侧第一个字母是Vn
{
if (p[i].right.length() == 1) //只有一个字母
{
string ff;
ff = Letter_First(p p[i].right[0]); //把右侧字母的first集合加入到左侧字母中
for (int k = 0;k < ff.length();k++)
{
if (First[Vn.find(ch)].find(ff[k])>100)
{
First[Vn.find(ch)] += ff[k];
}
}
}
else //多个字母都是Vn
{
for (int j = 0;j < p[i].right.length();j++)
{
string TT;
TT = Letter_First(p p[i].right[j]);
if (!(TT.find(‘#‘)>100) && (j + 1) < p[i].right.length()) /
- 上一篇:姿态解算c代码
- 下一篇:C++中文分词系统代码
相关资源
- 逆波兰表达式 c语言实现
- 编译原理实验 DFA的最小化 c++代码
- 编译原理课程设计广工C语言
- 编译原理课程设计——算术表达式、
- 广工编译原理课程设计 PL0C++改进需用
- 0513《编译原理》答案 设计并实现TI
- 编译原理firstselectfollow实验源代码
- 编译原理实验判断文法是不是LL1文法
- 编译原理Pascal语言编译器用C实现
- 编译原理PL0实验报告
- 编译原理正则表达式转NFA转DFA DFA最小
- 编译原理虎书课后习题解答
- 东北大学课程设计—编译原理课程设
- 编译原理-简单编译器课程设计C语言源
- PL/0编译程序文本(C版本)
- 编译原理 压缩文法等价变换
- 编译原理 电梯程序
- 编译原理C++实现判断LL1文法
- 编译原理课程设计——目标代码生成
- 编译原理课程设计(PASCAL)
- 编译原理实验之四元式的生成源代码
- 北邮编译原理实验--词法分析
- 编译原理 PASCAL编译器
- 编译原理语法分析、词法分析源代码
- 编译原理之NULL集、first、follow集C语言
- 编译原理(龙书中英版)第二版 中文
- 编译原理-词语语法语义分析
- 编译原理LLLRSLR作业集锦
- 编译原理课设含词法语法设计以及实
- 编译原理 pl0编译器 c语言版
评论
共有 条评论